13.1C语言指针 字符指针变量、数组指针变量、二维数组传参的本质

1.字符指针变量

先看一段代码
❗const char* pstr = “hello bit.”
❓是把字符串 hello bit 放到字符指针变量 pstr吗
🌏不是,是把字符串 hello bit. ⾸字符 h 的地址放到了pstr中

int main()
{
	
	char ch = 'w';
	char* pc = &ch;
	printf("%c\n",*pc);
	const char* pstr = "hello bit";
	printf("%s\n",pstr);
	return 0;
}

在这里插入图片描述
再看一段代码

#include <stdio.h>
int main()
{
	char str1[] = "hello bit.";
	char str2[] = "hello bit.";
	const char* str3 = "hello bit.";
	const char* str4 = "hello bit.";
	if (str1 == str2)
		printf("str1 and str2 are same\n");

	//首元素地址不等
	else
		printf("str1 and str2 are not same\n");

	if (str3 == str4)
		printf("str3 and str4 are same\n");
	else
		printf("str3 and str4 are not same\n");

	return 0;

}

题目出自《剑指offer》
在这里插入图片描述
解释:
因为str1数组和str1数组在不同的空间,首元素地址不一样,所以打印出第一行这种情况。
🌏再看指针str3和指针str4都是指向”hello bit“常量字符串,不能被修改的一样的内容,所以保存一份就行了,不用另辟空间保存。当只保存一份
所以str3和str4都是指向“hello bit” 然后储存的首元素地址,所以都一样,打印出第二行。

在这里插入图片描述

2.数组指针变量

🌏数组指针变量:存放的应该是数组的地址,能够指向数组的指针变量。
int (*p)[10]

🌈解释:p先和*结合,说明p是⼀个指针变量变量,然后指着指向的是⼀个⼤⼩为10个整型的数组。所以p是⼀个指针,指向⼀个数组,叫数组指针。

int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	//如果要存放个数组的地址,就得存放在数组指针变量中
	int(*p)[10] = &arr;

	return 0;
}

在这里插入图片描述
int:p指向的数组的元素类型
(*p):p是数组指针变量名
[10]:p指向数组的元素个数

3.二维数组传参的本质

void test(int(*p)[5], int a, int b)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < a; i++)
	{
		for (j = 0; j < b; j++)
		{
			printf("%d ",*(*(p+i)+j));
		}
		printf("\n");
	}
	return 0;
}
int main()
{
	int arr[3][5] = { {1,2,3,4,5},{2,3,4,5,6}, {3,4,5,6,7} };
	test(arr, 3, 5);
	return 0;
}

在这里插入图片描述
🌏总结:
1.二维数组的每一行是一个一维数组,这些一维数组可以看作二维数组的一个元素。二维数组也可以认为是一维数组的数组。
arr[0][j]:1 2 3 4 5
arr[1][j]:2 3 4 5 6
arr[2][j]:3 4 5 6 7
2.二维数组的数组名表示数组首元素地址,就是第一行的地址。
3.⼆维数组传参本质上也是传递了地址,传递的是第⼀⾏这个⼀维数组的地址,所以形参也是可以写成指针形式。

感谢阅读,若有不足,望指正。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值