【指针数组&数组指针】
1.指针数组test_ptr_array
指针数组是一个数组,是指由指针构成的数组,在这个素组中的所有元素都是指针,每个指针占用相同的字节。
Eg:顾名思义,这是一个存放指针类型的数组。如:int *p[n],二级指针int **p本质上就是一个指针数组,它有n个指针类型的数组元素。*它有n个指针类型的数组元素。这里执行p+1是错误的,这样赋值也是错误的:p=a;因为p是个不可知的表示,*但可以这样 p=1;这里p表示指针数组第一个元素的值,a的首地址的值。
如要将二维数组赋给一指针数组
int *p[3];
int a[3][4];
for(i=0;i<3;i++)
p[i]=a[i];
这里int *p[3] 表示一个一维数组内存放着三个指针变量,分别是p[0]、p[1]、p[2]
所以要分别赋值。![int *p1[10]的示意图](https://i-blog.csdnimg.cn/direct/2720f854b29e47b0bafd1fccff4eeae7.png)
在这里插入代码片
#include <stdio.h>
int main() {
// 指针数组定义
char *arr[4]={"hello","world","xiang","qian"};
// 查看占用空间
printf("sizeof(arr)=%zu Bytes,\n",sizeof(arr));
// 打印所有字符串
for(int i=0;i<4;i++){
printf("arr[%d]=%s\n",i,arr[i]);
}
return 0;
}
运行结果
2.指向数组的指针(pointer to an array)—又称“行指针”
数组指针:数组指针是一个指针,是指一个数组的指针,数组两字表示这个指针指向一个数组的首地址,并且这个指针加1时移动的位置是整个数组的长度。
Eg:定义长位 int (*p)[2] 从形式来看,是一个指针变量,指向包含了两个元素的数组,每次指针加一时,都要横跨整个步长。
int a[3][4];
int (*p)[4];//该语句是定义一个数组指针,指向包含4个元素的一维数组。
p=a; //将该二维数组的首地址赋给p,也就是a[0]或&a[0][0]
p++; //该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][]
所以数组指针也称指向一维数组的指针,亦称行指针。![int (*p2)[10]的解释摘录](https://i-blog.csdnimg.cn/direct/4ca9cfc698d34b379e856a1a5eeb2600.png)
例Eg1:
#include <stdio.h>
int main(){
int arr1[5] = {1,2,3,4,5};
int *p1;
int (*p2)[5] = &arr1;
p1 = arr1;
printf("%d\n", (int)sizeof(arr1));
printf("%p\t%p\n", &arr1, p1);
printf("%p\t%p\n", &arr1+1, p1+1);
return 0;
}

例Eg2:`#include
using namespace std;
int main(){
int arr1[5]={1,2,3,4,5};
int *p1;
int (*p2)[5]=&arr1;
p1=arr1;
cout<<sizeof(arr1)<<endl;
cout<<&arr1<<'\t'<<p1<<endl;
cout<<&arr1+1<<'\t'<<p1+1<<endl;
cout<<endl;
cout<<&arr1<<'\t'<<p2<<endl;
cout<<&arr1+1<<'\t'<<p2+1<<endl;
cout<<p1[2]<<'\t'<<*(*(p2+0)+2)<<endl;
}`
运行结果如下:

例Eg3:
#include <iostream>
using namespace std;
int main() {
int arr2[3][3]={{1,2,3},
{4,5,6},
{7,8,9}};
for(int i=0;i<3;i++){
for(int j=0;j<3;j++)
cout<<arr2[i][j]<<' ';
cout<<endl;
}
int *p3=&arr2[0][0];
cout<<p3[0]<<' '<<p3[7]<<endl;
int (*p4)[3]=arr2;
cout<<arr2<<'\t'<<p4<<endl;
cout<<arr2+1<<'\t'<<p4+1<<endl;
//cout << 0x28fee8 - 0x28fedc << endl;
cout<<*(*(p4+0)+1)<<'\t'<<*(*(p4+2)+0)<<endl;
return 0;
}
参考文章:链接如下,
【指向数组的指针】
https://blog.csdn.net/u012936940/article/details/79678605?ops_request_misc=&request_id=&biz_id=102&utm_term=%E6%8C%87%E9%92%88%E6%95%B0%E7%BB%84%E5%92%8C%E6%95%B0%E7%BB%84%E6%8C%87%E9%92%88&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-3-79678605.nonecase&spm=1018.2226.3001.4187
【C语言之数组指针和指针数组的区别】
https://blog.csdn.net/dzjian_/article/details/79826236?ops_request_misc=&request_id=&biz_id=102&utm_term=%E6%8C%87%E9%92%88%E6%95%B0%E7%BB%84%E5%92%8C%E6%95%B0%E7%BB%84%E6%8C%87%E9%92%88&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-6-79826236.nonecase&spm=1018.2226.3001.4187
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐
所有评论(0)