1.陣列的概念
陣列是相同型別的變數的有序集合
例如陣列int a[5];

2.陣列的大小
(1)陣列在一片連續的記憶體空間中存盤元素
(2)陣列元素的個數可以顯示或隱式指定
int a[5] = {1, 2};
int b[] = {1, 2};
問題:
1.a[2],a[3], a[4]的值是多少?
2. b包含了多少個元素?
編程求解
#include <stdio.h>
int main()
{
int a[5] = {1, 2};//顯式指定元素個數
int b[] = {1, 2};隱式元素個數
printf("a[2] = %d\n", a[2]);
printf("a[3] = %d\n", a[3]);
printf("a[4] = %d\n", a[4]);
printf("sizeof(a) = %d\n", sizeof(a));
printf("sizeof(b) = %d\n", sizeof(b));
//得到陣列里元素的個數
printf("count for a: %d\n", sizeof(a)/sizeof(int));// 20/4 = 5
printf("count for b: %d\n", sizeof(b)/sizeof(int));// 8/4=2
return 0;
}

a[2],a[3], a[4]的值是0,b包含了2個元素,
int a[5]={0};,這樣可以直接初始化陣列里的每個元素值為0
3.陣列地址與陣列名
(1)陣列名代表陣列首元素的地址(即a和&a[0]是相等的)
(2)陣列的地址需要用取地址符&才能得到
(3)陣列首元素的地址值與陣列的地址值相同
(4)陣列首元素的地址與陣列的地址是兩個不同的概念
示例代碼
#include <stdio.h>
int main()
{
int a[5] = { 0 };
printf("a = %p\n", a);
printf("&a = %p\n", &a);
printf("&a[0] = %p\n", &a[0]);
return 0;
}
運行結果如下,根據我們前面的定義,第一個和第三個肯定是一樣的,那么第二個呢?第二個代表的是陣列的地址,列印出來陣列的首地址也是沒錯的,但是概念確是不一樣的,陣列的地址包括了陣列的起始地址和長度,此處的長度為20,簡單的說,就是值是一樣的,但是所占用的記憶體空間長度不一樣,

4.陣列名的盲點
(1)陣列名可以看做一個常量指標
(2)陣列名“指向”的是記憶體中陣列首元素的起始位置
(2)陣列名不包含陣列的長度資訊
(4)在運算式中陣列名只能作為右值使用(相當于一個常量)
(5)只有在下列場合中陣列名不能看做常量指標
1)陣列名作為sizeof 運算子的引數
2)陣列名作為&運算子的引數
示例程式
#include <stdio.h>
int main()
{
int a[5] = {0};
int b[2];
int* p = NULL;
p = a;//將指標p指向陣列a,即p就是陣列a的地址值
printf("a = %p\n", a);//列印陣列第一個元素的地址
printf("p = %p\n", p);//由于上面p=a,指標變數所保存的值,所以同上結果
printf("p = %p\n", *p);//無值nil
printf("&p = %p\n", &p);//p是變數,變數就有地址,即列印指標變數p的地址
printf("sizeof(a) = %d\n", sizeof(a));// 4*5 =20
printf("sizeof(p) = %d\n", sizeof(p));// 指標變數占用記憶體的大小
printf("\n");
p = b;
printf("b = %p\n", b);
printf("p = %p\n", p);
printf("&p = %p\n", &p);
printf("sizeof(b) = %d\n", sizeof(b));//2*4=8
printf("sizeof(p) = %d\n", sizeof(p));
//b = a;陣列名不是指標,但有些時候可以常量指標,但兩者的本質是不同的
return 0;
}
5.小結
(1)陣列是一片連續的記憶體空間
(2)陣列的地址和陣列首元素的地址意義不同
(3)陣列名在大多數情況下被當成常量指標處理
(4)陣列名其實并不是指標,不能將其等同于指標
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/272844.html
標籤:其他
上一篇:記憶的秘密
下一篇:記:2021.4.4
