「这是我参与2022首次更文挑战的第24天,活动详情查看:2022首次更文挑战」。
题目八:
//二维数组
int main()
{
int a[3][4] = { 0 };
printf("%d\n", sizeof(a));
printf("%d\n", sizeof(a[0][0]));
printf("%d\n", sizeof(a[0]));
printf("%d\n", sizeof(a[0]+1));
printf("%d\n", sizeof(*(a[0] + 1));
printf("%d\n", sizeof(a + 1));
printf("%d\n", sizeof(*(a + 1));
printf("%d\n", sizeof(&a[0] + 1));
printf("%d\n", sizeof(*(&a[0] + 1));
printf("%d\n", sizeof(*a));
printf("%d\n", sizeof(a[3]));
return 0;
}
//48 344
//4
//16 4*4 a[0]相当于第一行作为一维数组的数组名,sizeof(arr[0])把数组名单独放在sizeof()内,计算的是第一行的大小
// 4 - a[0]是第一行的数组名,数组名此时是首元素的地址,a[0]其实就是第一昂第一个元素的地址,所以a[0] + 1就是第一行第二个元素的地址,地址大小是4/8个字节
//4 - *(a[0] + 1) 是第一行第二个元素,大小是4字节
//4 a是二维数组的数组名,没有sizeof(数组名),也没有&(数组名),所以a是首元素地址 而把二维数组看成一维数组时,二维数组的首元素是他的第一行,a就是第一行(首元素)的地址 //a+1就是第二行的地址
//16 sizeof(a[1]) 计算第二行的大小,单位是字节
//4 第二行的地址
//16 计算第二行大小
//a是首元素地址,就是第一行的地址 sizeof(*a)就是计算第一行的大小
//16
总结:
1.sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小
2.&数组名,这里的数组名表示整个数组,取出的是整个数组的地址
3.除此之外所有的数组名都表示首元素的地址
指针笔试题:
题目一:
int main()
{
int a[5] = { 1,2,3,4,5 };
int* ptr = (int*)(&a + 1);
printf("%d,%d", *(a + 1), *(ptr - 1));
return 0;
}
答案:2,5
取数组地址再加一,跳过整个数组
题目二:
struct Test
{
int Num;
char* pcName;
short sDate;
char cha[2];
short sBa[4];
}* p;
//假设p的值为0x100000,如下表达式的值分别为多少?
//已知,结构体Test类型的变量大小是20个字节
int main()
{
p = (struct Test*)0x100000;
printf("%p\n", p + 0x1);
printf("%p\n",(unsigned long) p + 0x1);
printf("%p\n", (unsigned int*)p + 0x1);
return 0;
}
答案: 0x00100014 0x00100001 0x00100004
指针加减整数的计算,取决于指针类型
题目三:
int main()
{
int a[4] = { 1,2,3,4 };
int* ptr1 = (int *)(&a + 1);
int* ptr2 = (int*)((int)a + 1);
printf("%x,%x", ptr1[-1], *ptr2);
return 0;
}
ptr1[-1] = ptr+(-1)
答案:4 2000000