字符串和指针新领悟
作者:互联网
”用双括号括起来的内容被视为指向该字符串存储位置的指针。“
——《C Primer Plus(第六版)中文版》P322
这句话怎么理解呢?只看主谓宾——用双括号括起来的内容视为指针。”用双括号括起来的内容“不就是字符串吗,所以有”字符串视为指针“。是这样吗?我们来看下面这个例子:
//运行平台:win10(64位) vs2019
//例1:
#include<stdio.h>
int main()
{
char* pstr = "hello";
printf("pstr:%p\n",pstr);//pstr:00D46B30
printf("\"hello\":%p\n","hello");//"hello":00D46B30
printf("pstr:%s\n",pstr);//pstr:hello
printf("\"hello\":%s\n","hello");//"hello":hello
printf("*pstr:%c\n",*pstr);//*pstr:h
printf("*\"hello\":%c\n",*"hello");//*"hello":h
printf("&pstr:%p\n",&pstr);//&pstr:00BAF7C8
printf("&\"hello\":%p\n",&"hello");//&"hello":00D46B30
return 0;
}
总结:
- &“hello”、“hello”、pstr地址是相同的,都是字符串首字母的地址;
- 由于上面1的原因,所以*pstr和*"hello"解引用得到的仅仅是首字母‘h’,是字符,用%c,不能用%s,会中断;如果用%p打印,得到‘h’的ASCII码00000068;
- 通过上面的例子对比,除了 &"hello"和&pstr意义不同,其他情况下”字符串视为指针“(指向字符串首字母的指针)这句话是正确的。
当函数处理字符串,需要输出多个处理后的字符串时,经常会用到二级指针的输出特性,但是为什么要用二级指针呢?二级指针到底怎么理解呢?我们在例子中说明。
//例2:
#include<stdio.h>
int main()
{
int tmp = 10;
int* pint = &tmp;
*pint = 20;
printf("tmp = %d\n",tmp);
char* pstr = "hello";
char** ppstr = &pstr;
char* ppstr = "moto";
printf("ppstr:%p\n",ppstr);//ppstr = &pstr,00BAF7C8
printf("*ppstr:%p\n",*ppstr);//*ppstr = *(&pstr) = pstr,"hello"
printf("**ppstr:%p\n",**ppstr);//**ppstr = **(&pstr) = *pstr,'h'
return 0;
}
说明:
我们知道:
数据类型的实质是一段固定大小的内存空间;给变量声明数据类型就是告诉编译器要给变量准备多大的内存空间,而变量的实质就是这段内存空间的别名,同时这段内存空间有自己的地址,即指针。
直接赋值: 通过内存空间的别名,即变量名,向内存空间写(存)入值;
间接赋值: 通过内存空间的地址,即指针,向内存空间写(存)入值;
上面程序中先通过直接赋值,向栈空间上名为tmp的一段内存空间中存入整数10,然后通过间接赋值,向地址为&tmp(=pint )的相同内存空间的重新存入整数20;
先通过直接赋值,向栈空间上名为pstr 的一段内存空间中存入(常量区保存字符串“hello”的内存空间的地址),然后通过间接赋值,向地址为&pstr (=ppstr )的相同内存空间的重新存入字符串“moto";
只是因为pstr是指针,&pstr是指针的地址,所以在写法上就用了二级指针。
标签:pstr,内存空间,领悟,ppstr,printf,字符串,hello,指针 来源: https://blog.csdn.net/u014157109/article/details/118342740