指针
知识点
我们知道 数组名表示首元素地址 但有两种情况是例外的
1. sizeof(数组名)——数组名表示整个数组
2.&数组名——数组名表示整个数组的地址,&a+1就是跳过整个数组后的地址
3, a=&a[0]=&a
int main(){
int a[4]={1,2,3,4};
printf("%d %d %d",a,&a[0],&a);
}//结果一样
4,sizeof和strlen(不计算'\0')区别
char arr[] = "abcdef";
//这种初始化方式后面个默认有个'\0',也就是说这个数组的内容为abcdef\0
printf("%d\n", sizeof(arr));———— 7
printf("%d\n", srelen(arr));———— 6
5,
char* p = "abcdef";
/*很多以为这是把abcdef存在指针p中,其实这是错误的想法,
它的本质是把首元素的地址存放在p中,
这也就是把a的地址存放在p中*/
6,二维数组等式,a=&a[0]=&a[0][0]
a[0]也是数组名,该数组包含四个元素a[0][0]...故a[0]=&a[0][0]=a
对于a来说首元素地址就是第一行的地址
对于a[0]来说首元素地址就是a[0][0]的地址
int a[3][4]={0};
即 int a[3][4]={ {0,0,0,0}, 三行四列
{0,0,0,0},
{0,0,0,0},
};
printf("%d\n", sizeof(a[0]));
//16 a[0] 是首元素,对于二维数组来说 它的首元素为第一行的,a[0]其实相当于第一行
// 的名称,相当于sizeof(第一行名称),表示整个数组的大小, 第一行有4个元素,所以
//结果为 4*4 a[0]表示第一行,a[1]表示第二行....
printf("%d\n", sizeof(a[0] + 1));
//4/8 上面讲了,a[0]本质是第一行的名称,sizeof里面表示单独放数组名,
//所以表示该数组的首元素地址,而第一行的首元素地址+1就是第一行第二个元素的地址
printf("%d\n", sizeof(*(a[0] + 1)));
//4 a[0]+1就是第一行第二个元素的地址,解引用就是该地址对应的元素值等同于a[0][1]
printf("%d\n", sizeof(a + 1));
//4/8 数组名不是单独放在sizeof里面,所以a表示二维数组首元素地址,对于二维数组来说
//它的首元素为第一行的地址,+1就是第二行地址
printf("%d\n", sizeof(*(a + 1)));
// 16 a+1为第二行地址,它是单独放在sizeof里面,所以表示整个数组大小
printf("%d\n", sizeof(&a[0] + 1));
//4/8 a[0]是第一行,&a[0]就是把整个数组的地址取出来,+1就是跳过整个数组指向
//下一个数组,也就是指向第二行,本质还是数组
printf("%d\n", sizeof(*(&a[0] + 1)));
// 16 &a[0]+1是第二行地址,解引用(*)后就拿到第二行数组的名称,sizeof()
//里面单独放数组名,表示整个数组的大小
printf("%d\n", sizeof(*a));
//16 数组名不是单独放在sizeof里面,所以表示二维数组的首元素地址,
//二维数组的首元素地址就是第一行地址,解引用(*)后相当于sizeof(第一行名称),
//数组名单独放里,所以是整个第一行数组的大小
printf("%d\n", sizeof(a[3]));
//16 a[3]相当于第四行地址,虽然这里没有第四行,但不影响它单独放在sizeof里面,
//所以表示整个数组的大小,这个数组跟a[0],a[1]哪些是一样的道理,都是4个元素
错题
printf("%d\n", sizeof(a + 0));——4
// 4 数组名不是单独放在sizeof里面,所以数组名表示首元素地址,
//首元素地址+0还是首元素地址,是地址在32位平台就4个字节,64位平台就8个字节