c语言二级地址指针使用辨析
author: hjjdebug
date: 2025年 10月 21日 星期二 10:32:38 CST
description: c语言二级地址指针使用辨析
文章目录
- 0 前言
- 1, 测试代码
- 2, 结论
0 前言
编码时遇到了一个问题, src_ctx 是一个二级指针. 即指向地址表的地址
则 src_ctx[i] 是一个一级指针.
问 src_ctx[i] 等于 &(*src_ctx)[i] 吗 ?
这个问题有点复杂, 首先要解释一下 &(*src_ctx)[i] 它是什么意思.
首先. 括号是第一优先级, *src_ctx 是一个一级指针.
然后它向右结合, 因为[]的优先级高于取地址优先级.
结果是第i个数组元素的地址.
你查一下AI, 它说不相同, 但没有说清楚为什么不相同.
所以我写了如下的测试代码调试验证, 理解了其不同的真正含义.
1, 测试代码
$ cat main.cpp#include <stdio.h>
//下面给个实例去验证
int a1[]={1,2,3,4,5};
int a2[]={10,20,30,40,50};
int a3[]={100,200,300,400,500};
//二级指针aa, 存储的是地址
int *aa[]={a1,a2,a3
};
int size=sizeof(aa)/sizeof(aa[0]);
int main()
{printf("a1:%p, a2:%p\n",a1,a2);int * p1=aa[1]; //aa[1] 实际是a2 的地址int * p2= &(*aa)[1]; // *aa 是 a1的地址,[1] 是 a1的第2个元素, 再取地址printf("aa[1] is %p, &(*aa)[1] is %p\n",p1,p2);return 0;
}
运行结果
$ ./tt
a1:0x404020, a2:0x404040
aa[1] is 0x404040, &(*aa)[1] is 0x404024
2, 结论
//&(*src_ctx)[i] 等于 src_ctx[i] 吗? 不等
//src_ctx[i] 是数组src_ctx中第i个指针, i=0为第一个指针
//&(*src_ctx)[i], 是数组src_ctx中第一个指针的第i个元素的地址
//关键点: *src_ctx 就是 src_ctx[0], 就是数组中的第一个指针