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.⼆维数组传参本质上也是传递了地址,传递的是第⼀⾏这个⼀维数组的地址,所以形参也是可以写成指针形式。
感谢阅读,若有不足,望指正。