写这篇文章是最近碰到了这两道题目:
#include <stdio.h>int k=7;void f(int **s){ int *t=&k ;*s=t;printf("%d,%d,%d,",k,*t,**s);}main(){ int i=3,*p=&i,**r = &p ;f(r); printf("%d,%d,%d\n", i,*p,**r);}
结果:7,7,7,3,7,7
关键在于*s = t;
举个例子
#include <stdio.h>int main() {int num1 = 42;int num2 = 100;int *ptr1 = &num1; // 一个指向 num1 的指针int **ptr2 = &ptr1; // 一个指向 ptr1 的指针printf("num1 = %d\n", num1); // 输出 42printf("*ptr1 = %d\n", *ptr1); // 输出 42// 修改二级指针的值,使其指向 num2*ptr2 = &num2;printf("num1 = %d\n", num1); // 输出 100,因为 ptr1 现在指向了 num2printf("*ptr1 = %d\n", *ptr1); // 输出 100return 0;
}
第二个
#include <stdio.h>int *f(int *s) {s += 1;s[1] += 6;*s++ += 7;return s;
}int main() {int a[5] = {1, 2, 3, 4, 5};int *p;p = f(&a[1]);printf("%d, %d, %d, %d", a[1], a[2], *p, p[1]);return 0;
}
首先,我们有一个整数数组 a
,其初始值为 {1, 2, 3, 4, 5}
。
然后,在 main
函数中,我们将函数 f
应用于 a
数组的第二个元素(索引为1),也就是 &a[1]
。
现在,让我们一步步解释每个操作:
-
s += 1;
将传递给函数f
的指针s
移动到了数组的下一个元素,即索引为2的元素。 -
s[1] += 6;
将索引为3的元素(也就是数组a
中的第四个元素)增加了6,所以a[3]
变成了10。 -
*s++ += 7;
首先,将指针s
所指向的元素(现在是索引为2的元素,也就是a[2]
)增加了7,所以a[2]
变成了10。然后,指针s
移动到了下一个元素,即索引为3的元素(也就是a[3]
)。 -
主要有两个点需要知道,是s[1]等同于s+1;*s++ +=7,里面*s优先级高,*s+=之后,++是s在执行,不是*s,且++优先级在这里面最低。
3最近发现结构体可以这样赋值
#include <stdio.h>struct Point {int x;int y;
};int main() {struct Point points[3] = {{1, 2}, {3, 4}, {5, 6}};// 打印数组中的值for (int i = 0; i < 3; i++) {printf("Point %d: x = %d, y = %d\n", i, points[i].x, points[i].y);}return 0;
}