写这篇文章是最近碰到了这两道题目:
- #include
-
- 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
-
- int main() {
- int num1 = 42;
- int num2 = 100;
-
- int *ptr1 = &num1; // 一个指向 num1 的指针
- int **ptr2 = &ptr1; // 一个指向 ptr1 的指针
-
- printf("num1 = %d\n", num1); // 输出 42
- printf("*ptr1 = %d\n", *ptr1); // 输出 42
-
- // 修改二级指针的值,使其指向 num2
- *ptr2 = &num2;
-
- printf("num1 = %d\n", num1); // 输出 100,因为 ptr1 现在指向了 num2
- printf("*ptr1 = %d\n", *ptr1); // 输出 100
-
- return 0;
- }
第二个
- #include
-
- 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
-
- 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;
- }