指针数组&&数组指针

108 阅读2分钟

「这是我参与2022首次更文挑战的第27天,活动详情查看:2022首次更文挑战


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);
//上述两种写法等价