写这篇文章是最近碰到了这两道题目:
#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); // 输出 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 <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;
}