c语言——指针进阶(4)
大家好,我是小锋,指针进阶我们已经学习完了,下面我们来做一些练习,为大家加深理解
int main() { int a[5] = { 1, 2, 3, 4, 5 }; int *ptr = (int *)(&a + 1); printf( "%d,%d", *(a + 1), *(ptr - 1)); return 0; }
大家看看程序输出什么?
struct Test { int Num; char* pcName; short sDate; char cha[2]; short sBa[4]; }*p = (struct Test *)0x100000; //已知,结构体Test类型的变量大小是20个字节 int main() { printf("%p ", p + 0x1); printf("%p ", (unsigned long)p + 0x1); printf("%p ", (unsigned int*)p + 0x1); return 0; }
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; }
要解决这道题我们要知道这个数组是怎么存储在内存中的
int main() { int a[3][2] = { (0, 1), (2, 3), (4, 5) }; int* p; p = a[0]; printf("%d", p[0]); return 0; }
这一道题其实有坑我们看在初始化数组是用的是()而不是{},这里的()是逗号表达式所以数组存储应该是这样的
所以输出是
int main() { int a[5][5]; int(*p)[4]; p = a; printf( "%p,%d ", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]); return 0; }
作这一道题我们要画图
int main() { char *c[] = {"ENTER","NEW","POINT","FIRST"}; char**cp[] = {c+3,c+2,c+1,c}; char***cpp = cp; printf("%s ", **++cpp); printf("%s ", *--*++cpp+3); printf("%s ", *cpp[-2]+3); printf("%s ", cpp[-1][-1]+1); return 0; }