字符串和指针新领悟

在这里插入图片描述

一.字符串常量

”用双括号括起来的内容被视为指向该字符串存储位置的指针。“
——《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意义不同,其他情况下”字符串视为指针“(指向字符串首字母的指针)这句话是正确的。

在这里插入图片描述
——这是《C和指针》P269

  • 🌰1: “xyz” + 1的意义:这个表达式计算“指针值加1的值”,由于“xyz”表示指向字符串第一个字符‘x’的指针值,所以“加1”,就是指向字符串第二个字符‘y’的指针值。
    printf("%c",“xyz” + 1);输出‘y’;

  • 🌰2:*"xyz"的意义:‘x’;

  • 🌰3: “xyz”[2]的意义:‘z’,类型于数组名;

二.二级指针的输出特性

当函数处理字符串,需要输出多个处理后的字符串时,经常会用到二级指针的输出特性,但是为什么要用二级指针呢?二级指针到底怎么理解呢?我们在例子中说明。

//例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;
}

说明:
我们知道计算机中的所有数据都是按二进制方式存储的,那么:
数据类型的实质:声明变量数据类型就是告诉编译器要给变量准备多大的内存空间,并按照什么方式解析按二进制方式存储的数据(详见《C和指针》6.2值和类型)
《C和指针》6.2值和类型
另外一个例子,数字4276803原来是int类型的,现在按照char*类型来解析,输出“ABC”:

int tmp = 4276803;
printf("%s\n",(char*)&tmp);

变量的实质就是这段内存空间的别名,同时这段内存空间有自己的地址,即指针。
直接赋值: 通过内存空间的别名,即变量名,向内存空间写(存)入值;
间接赋值: 通过内存空间的地址,即指针,向内存空间写(存)入值;

上面程序中先通过直接赋值,向栈空间上名为tmp的一段内存空间中存入整数10,然后通过间接赋值,向地址为&tmp(=pint )的相同内存空间的重新存入整数20;

先通过直接赋值,向栈空间上名为pstr 的一段内存空间中存入(常量区保存字符串“hello”的内存空间的地址),然后通过间接赋值,向地址为&pstr (=ppstr )的相同内存空间的重新存入字符串“moto";
只是因为pstr是指针,&pstr是指针的地址,所以在写法上就用了二级指针。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值