关于c语言二级指针和指针指向数组

写这篇文章是最近碰到了这两道题目:

#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]

现在,让我们一步步解释每个操作:

  1. s += 1; 将传递给函数 f 的指针 s 移动到了数组的下一个元素,即索引为2的元素。

  2. s[1] += 6; 将索引为3的元素(也就是数组 a 中的第四个元素)增加了6,所以 a[3] 变成了10。

  3. *s++ += 7; 首先,将指针 s 所指向的元素(现在是索引为2的元素,也就是 a[2])增加了7,所以 a[2] 变成了10。然后,指针 s 移动到了下一个元素,即索引为3的元素(也就是 a[3])。

  4. 主要有两个点需要知道,是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;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学徒在修行

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值