C语言进阶:第27课、数组的本质分析

数组是相同类型的变量的有序集合。

int a[5];   // 5个int类型数据,每个元素都是int型数据;a代表数组第一个元素的起始地址。这20个字节空间的名字
	        为a,a[0]、a[1]等都是a中的元素,并非元素的名字。数组中的元素没有名字。
数组的大小:
数组在一片连续的内存空间中存储元素
数组元素的个数可以显式或隐式指定
int main()
{   
    int a[5] = {1, 2};    
    int b[] = {3, 4};
    
    printf("%d, %d, %d\n", a[2], a[3], a[4]);
    
    int a1 = sizeof(a);
    int b1 = sizeof(b);
    
    printf("%d, %d\n", a1, b1);
    
    int an = a1/sizeof(int);
    int bn = b1/sizeof(int);
    
    printf("%d, %d\n", an, bn);
            	
	return 0;
}

编译运行:

~/will$ ./a.out
0, 0, 0
20, 8
5, 2
数组名代表 数组首元素的地址;
数组的地址需要用取地址符&才能得到;
数组首地址的地址值与数组的地址值相同;
数组 首元素的地址数组的地址是两个不同的概念。//首地址是一个地址,而 数组的地址是一个包含数组长度的地址
int main()
{   
    int a[5] = {1, 2, 3, 4, 5};  
    
    printf("%p\n", a); 
    printf("%p\n", &a);  
    printf("%p\n", &a[0]);   

	return 0;
}

但是编译运行的结果是一样的:

~/will$ ./a.out
0xbfae18fc
0xbfae18fc
0xbfae18fc
数组名可以看做一个 常量指针
数组名“指向”的是内存中 数组首元素的起始位置
数组名 不包含数组的长度信息

在表达式中数组名只能作为右值使用

只有在 下列场合中数组名不能看做常量指针
数组名作为sizeof操作符的参数

数组名作为&运算符的参数

观察下面代码:

int main()
{   
    int a[5] = {1, 2, 3, 4, 5};  
    int b[2];
    int* p = NULL;
    
    p=a;
    
    printf("%p\n", a);
    printf("%p\n", p);
    printf("%p\n", &a);
    printf("%p\n", &p);
    printf("sizeof(a) = %d\n",sizeof(a));
    printf("sizeof(p) = %d\n",sizeof(p));
    
    printf("\n");
    
    p=b;
    
    printf("%p\n", b);
    printf("%p\n", p);
    printf("%p\n", &b);
    printf("%p\n", &p);
    printf("sizeof(b) = %d\n",sizeof(b));
    printf("sizeof(p) = %d\n",sizeof(p));
     
    //b = a; error

	return 0;
}

编译运行:

~/will$ gcc test.c
~/will$ ./a.out
0xbfeb7260
0xbfeb7260
0xbfeb7260
0xbfeb727c
sizeof(a) = 20
sizeof(p) = 4

0xbfeb7274
0xbfeb7274
0xbfeb7274
0xbfeb727c
sizeof(b) = 8
sizeof(p) = 4

数组是一片连续的内存空间
数组的地址和数组首元素的地址意义不同
数组名在大多数情况下被当做常量指针处理
数组名其实不是指针,不能将其等同于指针,比如两个大小不同的数组,是不能用数组名相互赋值的。

猜你喜欢

转载自blog.csdn.net/qq_28388835/article/details/80389672