指针数组&&数组指针
【摘要】 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;
}
打印字符串只需要提供起始地址就可以了,从起始位置向后打印 打印整形则要解引用才能里面的值
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)