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]的示意图

在这里插入代码片

#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]的解释摘录

例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;

}`
运行结果如下:
在这里插入图片描述

其中20(0x14),是sizeof(arr1)
例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

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐