深入了解指针(三)

一,指针变量
(1)字符指针变量
(2)数组指针变量
二 .⼆维数组传参的本质

上次我们介绍了指针变量,但指针变量除了有整型指针变量int *还有什么呢?
当然有多少数据类型就有多少指针变量咯。

一数组名的理解
字符指针变量

了解字符指针变量我们要先了解下面的一个例题

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

答案是


在这里插入图片描述

因为“hello bit”在内存中是单独的⼀个内存区域,是常量字符串,几个指针同时指向常量的时候,是同一块区域,但初始几个不同的数组就会有不同的内存块被开辟。

(2)数组指针变量
不同于以前的指针数组,数组指针变量是一个指向数组的指针,它的写法和指针数组类似。
比如我们写一个指向大小为3个整型指针变量的数组arr:int (*arrp)[5]

在这里插入图片描述

在这里插入图片描述
这里arr的大小是5个整型也就是20个字节,所以arr+1就是跳过 20个字节后的数组指针变量。
因为未定义,所以乱码。
二 .⼆维数组传参的本质

来看下面的代码

int arr1[5] = { 2,2,3,4,5 };
int(*arr)[5] = &arr1;//数组指针

	printf("%d", *(*(arr+0)+2));

在这里插入图片描述
这段代码的答案是3,((arr+0)+2)的意思是arr跳过0*[5]个字节的数组指针变量,再从头开始的第2+1个元素(因为是从0开始的)。
那么要是想访问到*(arr+i)(i>0)的内容,就要连续存放很多元素。每一个数组指针变量就是一列。
这就是⼆维数组传参的本质。上面的 ((arr+0)+2)=arr[0][2].
下面模拟⼆维数组传参的本质

void test(int a[3][5], int r, int c)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < r; i++)
	{
		for (j = 0; j < c; j++)
		{
			printf("%d ", a[i][j]);//等价于*(*(a+i)+j)
		}
		printf("\n");
	}
}
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;
}

在这里插入图片描述

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值