一、数组的概念
数组的大小:
编程实验:数组的初始化
#include <stdio.h>
int main()
{
int a[5] = {1, 2};
//int a[5] = {0}; //编译器会将未指定的元素初始化为0
int b[] = {1, 2};
printf("a[2] = %d\n", a[2]); //0 //编译器将没有指定的数组元素初始化为0
printf("a[3] = %d\n", a[3]); //0
printf("a[4] = %d\n", a[4]); //0
printf("sizeof(a) = %d\n", sizeof(a)); //20
printf("sizeof(b) = %d\n", sizeof(b)); //8
//元素个数=数组大小÷每个元素的大小
printf("count for a: %d\n", sizeof(a)/sizeof(int)); //5
printf("count for b: %d\n", sizeof(b)/sizeof(int)); //2
return 0;
}
输出:
二、数组地址与数组名
编程实验:数组名与数组地址
#include <stdio.h>
int main()
{
int a[5] = { 0 };
printf("a = %p\n", a); //a代表数组第一个元素的地址,长度为4
printf("&a = %p\n", &a);//对整个数组取地址,与上一个语句的地址相同,但长度为20
printf("&a[0] = %p\n", &a[0]);
return 0;
}
输出:
结果分析:输出的三个地址相同,第一和第二条代码输出的地址也相同,但是它们的内存空间从长度却是不一样的。可以通俗地描述为:我们使用GPS定位我们家和小区的位置,得到两个的位置是一样的,但是小区和家却有着本质的区别。
三、数组名的盲点
编程实验1:
#include <stdio.h>
int main()
{
int a[5] = { 0 }; //定义数组a,每个元素初始化为0
int b[2]; //初始化的值为随机的
int* p = NULL;
p = a; //将指针p指向数组a
printf("a = %p\n", a); //p = 0020F9BC; 打印数组的第一个元素的地址
printf("p = %p\n", p); //p = 0020F9BC; 打印数组的第一个元素的地址
printf("&p = %p\n", &p); //&p = 0020F9A0; 指针是变量,所以有地址
printf("sizeof(a) = %d\n", sizeof(a));//sizeof(a) = 20
printf("sizeof(p) = %d\n", sizeof(p));//sizeof(p) = 4
printf("\n");
getchar();
return 0;
}
输出:
结果分析:
说明指针p 和 数组a 是两个不同的东西。
编程实验2:
#include <stdio.h>
int main()
{
int a[5] = { 0 }; //定义数组a,每个元素初始化为0
int b[2]; //初始化的值为随机的
int* p = NULL;
printf("\n");
p = b; //将指针p指向数组b
printf("b = %p\n", b);//数组b的地址
printf("p = %p\n", p); //p指针指向的地址
printf("&p = %p\n", &p);//p指针自身的地址
printf("sizeof(b) = %d\n", sizeof(b)); //8
printf("sizeof(p) = %d\n", sizeof(p)); //4
//b = a; //将一个数组名赋给另一个数组(不兼容的类型)
return 0;
}
输出:
四、小结
本文为听课笔记,课程出处:
https://item.taobao.com/