指针数组&&数组指针

举报
芒果_Mango 发表于 2022/02/26 21:45:14 2022/02/26
【摘要】 arr[i] == *(arr+i);arr[i][j] == *(*(arr+i)+j) == *(arr[i]+j)关于arr[i][j]的理解*(*(arr+i)+j) == arr[i][j](arr+i):是找到第i个位置的地址*(arr+i):找到指针数组中的第i个位置的元素,这个元素是一个数组名*(*(arr+i)+j):通过数组名(数组首元素地址)偏移j个长度,再解引用就能...

arr[i] == *(arr+i);
arr[i][j] == *(*(arr+i)+j) == *(arr[i]+j)

关于arr[i][j]的理解

*(*(arr+i)+j) == arr[i][j]

(arr+i):是找到第i个位置的地址

*(arr+i):找到指针数组中的第i个位置的元素,这个元素是一个数组名

*(*(arr+i)+j):通过数组名(数组首元素地址)偏移j个长度,再解引用就能找到这个数组名起始位置向后j位置的数据


指针数组存放字符数组数组名

int main()
{
    const char* arr[5] = {"abcdef","bcdefg","hehe","haha","zhangs"};
    //arr数组存放的都是常量字符串,所以用const修饰数组
    int i= 0;
    for(i = 0;i<5;i++)
    {
        printf("%s\n",arr[i]);
    }
    return 0;
}

image-20220214205925089


打印字符串只需要提供起始地址就可以了,从起始位置向后打印 打印整形则要解引用才能里面的值


int* arr[5]	//指针数组
//arr是数组名,数组名是首元素地址,int**类型

指针数组的数组名是用二级指针存放的
   int* arr[5];
int** p = arr;
//相当于int**p = &arr[0] 
int** p2 = &arr[3];

4.数组指针-是指针


int a = 10;
int* pi = &a;	//整形的地址存放在整形指针中
char ch = 'w';
char* pc = ch;//字符的地址存放在字符指针中

数组指针的写法

//int *parr[10] :parr先和[]结合,是数组,数组元素类型为整形指针

 //若想parr是指针->用括号括起来
int (*parr)[10] = &arr;	//取出的是数组的地址,应该存放到数组指针中

//int(*parr)[10] :parr先和*结合,是指针,指向的是数组,数组有10个元素,每个元素是int类型

int* arr[10] = {0};
int* (*p)[10] = &arr;	//取出数组的地址放到数组指针
int** p = arr;	//数组元素为:int*类型。数组名是首元素地址,类型为:int**

//arr的类型:int*
//&arr[0]的类型:int*
//&arr的类型:int(*)[10]

指针的类型决定它加减整数跳过多少个字节


数组名是首元素地址  有两个例外
1.数组名单独放在sizeof内部
   sizeof(数组名),这里的数组名表达式的是整个数组,计算的是整个数组的大小
2.&数组名
 此时的数组名标识的是整个数组,取出的是整个数组的地址,
    &arr+1 :跳过一个数组的内容

数组名在传参时,会降级为首元素地址

void Print1(int arr[],int sz);
void Print2(int* arr,int sz);
//上述两种写法等价


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。