前言
在初级阶段的《指针》章节,我们知道了指针基本概念:
- 指针是个变量,用来存放地址,地址唯一标识一块内存空间。
- 指针的大小是固定的4/8个字节(32位平台/64位平台)。
- 指针是有类型,指针的类型决定了指针的±整数的步长,指针解引用操作的时候的权限。
- 指针的运算。
接下来,我们继续探讨指针的高级使用
一、字符串指针
(1)例1
int main()
{
char* p = "hello world";
//*p = 'w';//这种写法是错的,不可通过*p更改
//const char* p = "hello world";
printf("%s\n", p);
return 0;
}
代码 char* p = “hello world”; 本质是把字符串 hello 首字符的地址放到了p中。打印时通过p找到h的地址,打印出h,并依次打印hello world等字符,直到遇到\0停止打印。
(2)例2
#include <stdio.h>
int main()
{
char str1[] = "abcdef";
char str2[] = "abcdef";
char* str3 = "abcdef";
char* str4 = "abcdef";
//情况1
if (str1 == str2)
printf("hehe\n");
else
printf("haha\n");
//情况2
if (str3 == str4)
printf("hehe\n");
else
printf("haha\n");
return 0;
}
情况1打印结果为haha
情况2打印结果为hehe
这是因为str3和str4指向的是一个同一个常量字符串,是不可更改的,开辟两个空间浪费资源。所以C/C++会把多个个指针指向的同一个字符串存储到单独的一个内存区域。但是用相同的常量字符串去初始化不同的数组的时候就会开辟出不同的内存块。所以str1和str2不同,str3和str4不同。
二、指针数组
通过前面的学习,我们可以知道形如int arr1[5] = {0};的是整形数组,数组存放的是整形,形如char arr2[10] = {0};的是字符数组,数组存放的是字符。同理,指针数组应该是数组,数组存放的是指针。
//指针数组 - 数组 - 存放指针的数组
int* arr[4];//存放整形指针的数组 - 指针数组
char* ch[5];//存放字符指针的数组 - 指针数组
//指针数组的简单使用
int main()
{
int a = 10;
int b = 20;
int c = 30;
int d = 40