其他分享
首页 > 其他分享> > 字符串和指针新领悟

字符串和指针新领悟

作者:互联网

在这里插入图片描述
”用双括号括起来的内容被视为指向该字符串存储位置的指针。“
——《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;
}

总结:

  1. &“hello”、“hello”、pstr地址是相同的,都是字符串首字母的地址;
  2. 由于上面1的原因,所以*pstr和*"hello"解引用得到的仅仅是首字母‘h’,是字符,用%c,不能用%s,会中断;如果用%p打印,得到‘h’的ASCII码00000068;
  3. 通过上面的例子对比,除了 &"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