1.指针数组和指针数组
对于一个数组,我们应该立马联想,数组里面放的是什么?
对于一个指针,我们应该立马联想,指针指向的是什么数据类型?
显而易见指针数组里面放的是指针,数组指针就是定义了一个指针变量里面放的是数组的地址也就是这个指针指向了一个数组叫做数组指针。
来看以下都是什么意思
int *arr[10]//整型指针的指针数组
int **arr[10]//二级整型指针的指针数组
int (*arr)[10]//指向整型数组的数组指针
具体一个标识符是什么类型主要的是看他对应符号相关操作符的优先级,很明显下标引用 [] 比间接寻址 * 优先级高对于int *arr[10]所以是先结合成一个数组,然后数组里面放的是什么数据类型呢,放的是int*类型的数组那也就是说它是一个放整型指针的指针数组。
对于int (*arr)[10] arr先和*结合成为一个指针 指向一个int[10]类型的指针那也就是说他是一个指向整形数组的指针
2.&数组名和数组名
c语言中sizeof(数组名)和&数组名表示的都是整个数组
数组名单独出现代表的是数组首元素的地址
&数组名代表的是数组的地址
那我们来验证一下
#include<stdio.h>
int main() {
int arr[] = { 1,2,3,4,5,6,7,8,9,0 };
printf("arr = %p\n", arr);
printf("&arr = %p", &arr);
return 0;
}
这个完全一样呀?是一样的吗?
#include<stdio.h>
int main() {
int arr[] = { 1,2,3,4,5,6,7,8,9,0 };
printf(" arr + 1 = %p\n", arr + 1);
printf("&arr + 1 = %p", &arr + 1);
return 0;
}
我们知道对指针 + 1 其实是加上指针所指向类型的大小arr是数组首元素地址被指针指向也就是int类型+1所以也就是 + 4 &数组名含义是整个数组被一个指针指向 (这块的指针其实就是数组指针了)也就是int [10]类型 + 1所以就是 + 40了。
3.数组传参的降维问题
1.数组传参就会发生降维问题。
2.发生降维就会降维为指针。
3。是什么指针呢,是指向数组内所放类型的指针。
4.所有数组都可以看作一维数组,因为数组在内存中是线性连续且递增的,二维数组可以就看作一个一维数组里面放的数据类型也是一个一维数组
5.数组降维也就是里数组名最近的那一个来省略。
#include<stdio.h>
void text(int *arr) {//这里发生降维降维成指向其数组内部数据类型的指针也就是 int*
}
void text(int arr[]) {
}
void text2(int arr2[][4]) {
}
void text2(int(*arr)[4]) {//这里发生降维降维成一个数组指针指指向其数组内部数据类型的指针也就是 int(*arr)[4]
}
int main() {
int arr[] = { 1,2,3,4,5,6,7,8,9,0 };
int arr2[3][4] = { 0 };
text(arr);
text(arr);
text2(arr2);
text2(arr2);
return 0;
}