上次我们介绍了指针变量,但指针变量除了有整型指针变量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;
}