- int main() {
- int a[5] = {1,2,3,4,5};
- int* ptr = (int*)(&a + 1);
- printf("%d,%d\n",*(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 【p的大小已知是20字节,所以 p + 1就会跳过 20 字节,20转换为十六进制就是0x14】
0x00100001 【强制转换成无符号long类型之后再 + 1就相当于是0x100000+0x000001】
0x00100004 【强制类型转换成无符号int*类型后+1等于跳过4个字节,相当于0x100000+0x000004】
- 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\n",p[0]);
- return 0;
- }
输出的结果为 1 :
首先我们要明白二维数组初始化中他用的是 ( ) ,那么这就是一个逗号表达式,实际上初始化的数据为 1 ,3 ,5 ,0 , 0 ,0;
那么指针 p 存放的就是 1 的地址,p[ 0 ] = p+0 所以p[ 0 ] = 1
- int main() {
- int a[5][5];
- int(*p)[4];
- p = a;
- printf("%p,%d\n",&p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);
- return 0;
- }

一定要重点理解:
&arr = 整个数组的地址;
*(&arr) = *(整个数组的地址) = arr = 数组名 = 首元素地址;
arr[ 2 ] 相当于是 *(arr + 2) 得到数组中第三个元素的值;
最后输出的结果是:f f f f f f f c,-4
这里低地址减高地址为负数 - 4
- int main() {
- int aa[2][5] = { 1,2,3,4,5,6,7,8,9,10 };
- int* ptr1 = (int*)(&aa + 1);
- int* ptr2 = (int*)(*(aa + 1));
- printf("%d,%d\n",*(ptr1 - 1),*(ptr2 - 1));
- return 0;
- }
这里需要注意的是:ptr1 的类型不是数组指针类型而是 int*类型
输出的结果是:10,5
- int main() {
- char* a[] = { "work","at","alibaba" };
- char** pa = a;
- pa++;
- printf("%s\n",*pa);
- return 0;
- }
这里要掌握 指针 + 1 到底跳过多少字节,之前我们也说过这个取决于该指针指向的变量是什么类型,例如 int* p = &a; 那么p + 1 就跳过4个字节的

一开始指针 pa 中存放的是数组 a[] 中首元素的地址,然后 pa++ 【这里要知道 pa 的类型是char*】也就是存放在 pa 中的地址 + 1 -> 往下跳过一个char*类型的内存空间,此时 pa 中存放的地址就变成了 "at" 第二个字符串元素的首地址
- int main() {
- char* c[] = {"ENTER","NEW","POINT","FIRST"};
- char** cp[] = {c+3,c+2,c+1,c};
- char*** cpp = cp;
- printf("%s\n",**++cpp );
- printf("%s\n", *--*++cpp+3);
- printf("%s\n", *cpp[-2]+3);
- printf("%s\n", cpp[-1][-1]+1);
- return 0;
- }

输出的结果为:
POINT
ER
ST
EW
这道题相对来说比较复杂,但是解题方法和前面的差不多就不过多解释了;
只要弄清楚 cpp[ -2 ] 相当于是 *(cpp - 2) 这个相关概念即可;