文章目录
前言
在指针初体验(C语言–指针初体验)中我们简单了解了指针的知识和使用:
- 指针就是个变量,用来存放地址,地址唯一标识一块内存空间。
- 指针的大小是固定的4/8个字节(32位平台/64位平台)。
- 指针是有类型,指针的类型决定了指针的±整数的步长,指针解引用操作的时候的权限。
- 指针的运算。
那么从本文开始将记录在深入学习指针过程中的一些课件摘录和学习笔记。
一、字符指针 ( char * )
字符型指针就是指向字符或者字符串的char*型指针,一般的使用如下:
int main()
{
char ch = 'w';//定义一个字符变量
char *pc = &ch;//将字符变量取地址存入一个字符型指针
return 0;
}
再比如:
int main()
{
const char* pstr = "hello bit.";//这里是把一个字符串放到pstr指针变量里了吗?
printf("%s\n", pstr);
return 0;
}
需要注意的是,这里并不是将整个“hello bit.”字符串存入pstr指针,而只是将字符串的首字母“h”的地址存入指针。这和字符数组常量赋值时是不一样的。
请看下面代码,思考输出结果:
#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;
}
输出结果:
可以看到,str1和str2这两个字符数组是不同的,但是str3和str4两个字符指针却是相同的。
原因是定义初始化两个字符数组时,虽然内容相同,但却是在内存中开辟出两个不同的空间来存放相同的东西,那这两个空间的地址自然是不同的,str1和str2作为字符数组首字符地址也自然不同;
而str3和str4指向的是一个同一个常量字符串。C/C++会把常量字符串存储到单独的一个内存区域,当几个指针指向同一个字符串的时候,他们实际会指向同一块内存。因此str3和str4是相同的。
此处需要注意的是,常量字符串是不能被修改的。如下代码其实是错误的:
char *ch = "world";
*ch = 'w';//常量字符串不可被修改
printf("%c\n", *ch);
因此,既然常量字符串无法被修改,那么两个指向相同字符串地址的指针变量也没必要开辟两个空间,共用一个就可以了。
二、const与指针及其他的关系
详见:
https://www.runoob.com/w3cnote/cpp-const-keyword.html
三、 指针数组
指针数组本质上是一个数组,一个用来存放指针的数组。
即数组中存放的全是地址。
如下:
int* arr1[10]; //整形指针的数组
char *arr2[4]; //一级字符指针的数组
char **arr3[5];//二级字符指针的数组
举例:a,b,c三个都是数组名,所以可以存入指针数组中。
//指针数组:
int main()
{
int a[5] = {
1,2,3,4,5 };
int b[] = {