目錄
0.數組要講的知識點
?1.一維數組的創建和初始化
?????????1.1 數組的創建:
?????????1.2數組實例:
?????????1.3?數組的初識化:
例子:
2.一維數組的使用
例子:
總結:
3.一維數組在內存中的存儲
4.二維數組的創建和初始化
? ? ? ? 4.1 二維數組的創建:
? ? ? ? 4.2 二維數組的初始化:
5.二維數組的使用:
二維數組的訪問
訪問單個元素
輸入二維數組,會打印出來
6.二維數組在內存中的存儲:
7.數組越界
一維數組的數組越界例子:
二維數組的數組越界例子:
8.數組作為函數參數
冒泡排序的核心思想:
冒泡排序的錯誤寫法:
冒泡排序函數的正確設計:
補充知識點:數組名
一維數組的數組名的理解:
但是,有兩個例外:
?編輯
1.sizeof(數組名),這里的數組名表示整個數組,計算的是整個數組的大小,單位是字節。
2.&數組名,取出的是數組的地址。&數組名,數組名表示整個數組。
二維數組的數組名的理解:
但是,有兩個例外:
1.sizeof(數組名),這里的數組名表示整個數組,計算的是整個數組的大小,單位是字節。
2.&數組名,取出的是數組的地址。&數組名,數組名表示整個數組。
0.數組要講的知識點
?1.一維數組的創建和初始化
?????????1.1 數組的創建:
數組是一組相同類型元素的集合
數組的創建方式:
?????????1.2數組實例:
?在C99標準之前,數值的大小必須是常量或者常量表達式
在C99之后,數值的大小可以是變量,為了支持變長數組(這種數組是不能初識化的)
?????????1.3?數組的初識化:
數組的初始化是指,在創建數組的同時給數組的內容一些合理初始值(初始化)
例子:
像第一個數組就是不完全初始化,像第三個就是完全初識化。數組在創建的時候如果想不指定數組的確定的大小就得初始化。數組的元素個數根據初始化的內容來確定,像第二個數組。
第一個里面有四個元素最后一個是“\0” 第二個里面有三個元素
2.一維數組的使用
對于數組的使用我們之前介紹了一個操作符: [] ,下標引用操作符。它其實就數組訪問的操作符。例如arr[4];我們找的是下標為4的元素
例子:
#include <stdio.h>int main()
{int arr[10] = { 0 };//數組的不完全初始化int sz = sizeof(arr) / sizeof(arr[0]);//計算數組的元素個數//對數組內容賦值,數組是使用下標來訪問的,下標從0開始。所以:int i = 0;//做下標for (i = 0; i < 10; i++)//這里寫10,好不好?{arr[i] = i;}//輸出數組的內容for (i = 0; i < 10; ++i){printf("%d ", arr[i]);}return 0;
}
總結:
1.數組是使用下標來訪問的,下標是從0開始。
2.數組的大小可以通過計算得到。
3.一維數組在內存中的存儲
#include <stdio.h>int main()
{int arr[10] = { 0 };int i = 0;int sz = sizeof(arr) / sizeof(arr[0]);for (i = 0; i < sz; ++i){printf("&arr[%d] = %p\n", i, &arr[i]);}return 0;
}
每個元素差地址差四,因為每個整型占4個字節,一個字節給一個地址編號
仔細觀察輸出的結果,我們知道,隨著數組下標的增長,元素的地址,也在有規律的遞增。由此可以得出結論:數組在內存中是連續存放的。
4.二維數組的創建和初始化
? ? ? ? 4.1 二維數組的創建:
例如:第一個二維數組的意思是,創建一個三行四列的整型數組
? ? ? ? 4.2 二維數組的初始化:
第一個二維數組,不分組,那么前面四個給第一行,后面的第二行和第三行都給0,其他的以此類推,最多12個元素。第二個二維數組,分組,{1,2}在第一行,第一行其他兩個給00,第二行同理,第三行全是0。第三個二維數組,行可以省略,但列不能省略,{1,2}在第一行,第一行其他兩個給00,第二行同理,沒有第三行。
5.二維數組的使用:
二維數組的使用也是通過下標的方式。可以把二維數組理解為:一維數組的數組
二維數組的訪問
#include <stdio.h>int main()
{int arr[3][4] = { 1,2,3,4,2,3,4,5,3,4,5,6 };int i = 0;for (i = 0; i < 3; i++){int j = 0;for (j = 0; j < 4; j++){printf("%d ", arr[i][j]);}printf("\n");}return 0;
}
訪問單個元素
#include <stdio.h>int main()
{int arr[3][4] = { 1,2,3,4,2,3,4,5,3,4,5,6 };int i = 0;printf("%d\n", arr[2][0]);return 0;
}
輸入二維數組,會打印出來
#include <stdio.h>int main()
{int arr[3][4] = { 1,2,3,4,2,3,4,5,3,4,5,6 };int i = 0;for (i = 0; i < 3; i++){int j = 0;for (j = 0; j < 4; j++){scanf("%d", &arr[i][j]);}}for (i = 0; i < 3; i++){int j = 0;for (j = 0; j < 4; j++){printf("%d ", arr[i][j]);}printf("\n");}return 0;
}
6.二維數組在內存中的存儲:
像一維數組一樣,這里我們嘗試打印二維數組的每個元素
#include <stdio.h>//打印地址
int main()
{int arr[3][4];int i = 0;for (i = 0; i < 3; i++){int j = 0;for (j = 0; j < 4; j++){printf("&arr[%d][%d] = %p\n", i, j, &arr[i][j]);}}return 0;
}
通過結果我們可以分析到,其實二維數組在內存中也是連續存儲的。我們會發現,他們的每個元素也是差4個字節的和一維數組一樣
他們是一行跟著一行的。
我們回來看為什么二位數組一定要有列,因為,看二維數組的存儲空間,如果不知道一行放幾個,下一行怎么知道跟哪去。
7.數組越界
數組的下標是有范圍限制的。數組的下規定是從0開始的,如果數組有n個元素,最后一個元素的下標就是n-1。
所以數組的下標如果小于0,或者大于n-1,就是數組越界訪問了,超出了數組合法空間的訪問。
C語言本身是不做數組下標的越界檢查,編譯器也不一定報錯,但是編譯器不報錯,并不意味著程序就是正確的0
所以程序員寫代碼時,最好自己做越界的檢查
一維數組的數組越界例子:
#include <stdio.h>int main()
{int arr[] = { 1,2,3,4,5,6 };//0~5 6~9int i = 0;//0~9int sz = sizeof(arr) / sizeof(arr[0]);for (i = 0;i < 10;i++){printf("%d ", arr[i]);}return 0;
}
二維數組的數組越界例子:
#include <stdio.h>int main()
{int arr[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };int i = 0;for (i = 0;i < 3;i++){int j = 0;for (j = 0;j <= 4;j++){printf("%d ", arr[i][j]);}}return 0;
}
8.數組作為函數參數
往往我們在寫代碼的時候,會將數組作為參數傳個函數,比如:我要實現一個冒泡排序(這里要講算法思想)函數將一個整形數組排序。
以冒泡排序為例子
冒泡排序的核心思想:
冒泡排序的錯誤寫法:
#include <stdio.h>void bubble_sort(int arr[])
{//趟數int sz = sizeof(arr) / sizeof(arr[0]);int i = 0;for (i = 0;i < sz - 1;i++){//一趟冒泡排序int j = 0;for (j = 0;j < sz-1-i;j++){if (arr[j] > arr[j + 1]){ //交換int tmp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = tmp;} }}
}int main()
{//數組//把數組的數據排成升序int arr[] = { 9,8,7,6,5,4,3,2,1,0 };//0 1 2 3 4 5 6 7 8 9int sz = sizeof(arr) / sizeof(arr[0]);//冒泡排序的算法,對數組進行排序bubble_sort(arr);int i = 0;for (i = 0;i < sz;i++){printf("%d ", arr[i]);}return 0;
}
出問題,那我們找一下問題,調試之后可以看到 bubble_sort 函數內部的 sz ,是1。難道數組作為函數參數的時候,不是把整個數組的傳遞過去
冒泡排序函數的正確設計:
#include <stdio.h>void bubble_sort(int arr[],int sz)
{//趟數int i = 0;for (i = 0;i < sz - 1;i++){//一趟冒泡排序int j = 0;for (j = 0;j < sz - 1 - i;j++){if (arr[j] > arr[j + 1]){//交換int tmp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = tmp;}}}
}int main()
{//數組//把數組的數據排成升序int arr[] = { 9,8,7,6,5,4,3,2,1,0 };//0 1 2 3 4 5 6 7 8 9int sz = sizeof(arr) / sizeof(arr[0]);//冒泡排序的算法,對數組進行排序bubble_sort(arr,sz);int i = 0;for (i = 0;i < sz;i++){printf("%d ", arr[i]);}return 0;
}
sz要在自定義函數外部求
補充知識點:數組名
一維數組的數組名的理解:
數組名確實能表示首元素的地址
但是,有兩個例外:
1.sizeof(數組名),這里的數組名表示整個數組,計算的是整個數組的大小,單位是字節。
2.&數組名,取出的是數組的地址。&數組名,數組名表示整個數組。
二維數組的數組名的理解:
二維數組表示首元素的地址時,表示第一行的地址