接下来让我们一起学习深一关于指针的知识
字符指针
先看下面的一段代码
#include<stdio.h>
int main()
{
char a = 'c';
char* p = &a;
printf("%c", *p);
return 0;
}
此时我们的p就是一个字符指针,但这就是最开始的用法,当我们使用字符指针指向一个常量字符串时会出现什么呢??,看下面的代码
#include<stdio.h>
int main()
{
const char* pc = "abcdef";
printf("%c\n", *pc);
printf("%s\n", pc);
return 0;
}
这个时候我们得到的运行结果如下图
可以看到%c和%s打印出来的结果是不同的,由此可以得出当字符指针指向字符串时代表的时字符串首字符的地址,为什么我们要用const修饰我们的字符串呢??因为”abcdef“是常量字符串,我们
使用*pc=‘w’时可能会导致编译器报错。让我们在思考一个问题,如果我们使用两个字符指针指向相同的字符串常量,这两个指针会是一样的值么,还是会像字符数组一样由两个不同的值,让我们通过一段代码来得到我们的结论:
#include<stdio.h>
int main()
{
const char* pc1 = "abcdef";
const char* pc2 = "abcdef";
char arr1[] = "abcdef";
char arr2[] = "abcdef";
if (pc1 == pc2)
{
printf("pc1 = pc2\n");
}
else
{
printf("pc1 != pc2\n");
}
if (arr1 == arr2)
{
printf("arr1 = arr2\n");
}
else
{
printf("arr1 != arr2\n");
}
return 0;
}
我们的运行结果如下图
因此我们就可以得出当两个字符指针指向字符串常量时两个字符指针是相等的
数组指针
这可不是指针数组啊
数组指针是指向数组地址的指针,其本质为指针;
指针数组是数组元素为指针的数组(例如 int *p[3],定义了p[0],p[1],p[2]三个指针),其本质为数组。
让我们来看下面这段代码
#include<stdio.h>
int main()
{
int arr[10] = { 0 };
int(*p)[10] = &arr;
return 0;
}
上次我们在初阶指针中说过&地址名的意思是整个数组的地址如果我们&数组名+1则是跳过整个数组,这个时候我们再来看这段代码,首先p和*结合表示这是指针,[10]则代表这个数组有十个元素,int表示指向数组的类型,由此我们可以得到p的类型为(类型)(*)[数组大小],让我们思考char* arr[5]要是有个数组指针p指向这个数组,那么p的类型是什么呢??是char*(*)[5]
欧克今天到这