C语言 进阶指针 指针数组与数组指针

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

f0039488861247459ced8809cd9d0a2e.png

 这个完全一样呀?是一样的吗?

#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;
}

1018b257db0d48af9fda5fa54feb19b7.png

 我们知道对指针 + 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;
}

 

 

 

 

 

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五毛变向.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值