指针数组与数组指针(C)
关于数组指针:
1 对于二维数组,初始化时,必须指定一个参数: int a [][3] ={{1,2,3},{1,2,3},{1,2,3}}, int a[][] ={} 这样是不允许的,因为要确定指针移动一步要走多远。 对于一位数组int a[] = {},这样可以。也就数说只有一个参数位置可以不用设置参数。
2 int (*p)[3] 必须加上小括号,这代表一个指向数组的指针,数字3,代表每一列有三个数。这样就定义了一个,二位数组。
p[0]代表第一行的第一个数的地址,p[1]代表第二行的第一个数的地址,p[2]代表第三行的第一个数的地址,注意与一位数组的
区别,对于一位数组p[0]代表第一个数字的实际值,而不是地址,但是对于二维数组p[0]代表的却是一个地址,要想得到这个地址的值
还要加上*号,如:*(p[0]),这代表第一行的第一个数字的实际值,也可以这样表达: a[0][0],这种表达方式就与一维数组的表达方式一样了。a[0][0] 就相当于 *(*(a+0)+0) , 相当于 *(a+0)[0], 相当于*(a[0]+0), 全都是在表达二位数组的第一行的第一个数的实际值,而不是地址值。
总结: 二位数组的指针的使用方式依旧是从一位数组的指针的使用方式来的,即:在一维数组中a[0]=*(a+0),
在二维数组中a[0]已经不再表示实际值了,而是表示地址值,但是a[0][0]=*(*(a+0)+0), 依旧表示的是实际值而不是地址,这还是相当于一维数组。
#include<stdio.h> int main() { int a[][2]={{1,2},{3,4}}; printf("1这是第一行第一个元素的值:%d\n",a[0][0]); printf("2这是第一行第一个元素的值:%d\n",*(*(a+0)+0)); printf("3这是第一行第一个元素的值:%d\n",(*(a+0))[0]); printf("4这是第一行第一个元素的值:%d\n",*(a[0]+0)); printf("-------------\n"); printf("这是第一行第一个元素的地址:%d\n",a[0]); printf("这是第一行第一个元素的数值:%d\n",*(a[0])); return 0; }
关于指针的数组:
int * a[2] 代表着指针的数组, 2 代表着 指针每走一步,向前走多远。
int b[][2]={{1,2},{1,2}}
a[0] = b[0] 存放着二维数组b 的第0行的第0个元素的地址,注意b[0] 代表的是地址,而不是实际值
a[1] = b[1] 存放着二维数组b第一行的第一个元素的地址,注意b[1]代表的是地址,而不是实际值。
#include<stdio.h> int main() { int *a[2]; int b[][2] = {{1,2},{3,4}}; a[0] = b[0]; //第一个行第一个元素的地址 a[1] = b[1]; //第二行第一个元素的地址 printf("%d\n",a[0]); //打印地址值 printf("%d\n",a[1]); printf("%d\n",*(a[0])); //打印实际值 printf("%d\n",*(a[1])); return 0; } // conclusion 关于指针的数组 int a[2],必须指明有几个元素,不同于一位数组。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律