c++中关于char型变量与字符串地址的输出、指针常量和常量指针

关于char型变量与字符串地址的输出

在c里面如果指针是一个基本数值型

int ,foalt ,long等,如果输出里有

cout << ptr << endl;

其中ptr是指针的名,则输出的值是指针的地址,

如果是char * (char指针) 则输出的是char指针的值。

在C++中,熟悉int和char型的变量是最基本不过的了,不过,我想,很多初学者会跟我一样,搞不懂如何输出一个char变量的地址?就举下面一个例子:

int i=97;

char c=‘a’;

cout<<“line 1:i=”<<i<<"\t\t"<<“c=”<<c;

cout<<"\nline 2:&i="<<&i<<"\t"<<"&c="<<&c;

我想,对于line 1的输出结果是没有任何疑问的,而且,我想对于初学指针的朋友来说,你可能也会跟我一样,毫不犹豫的认为输出的会是两个地址,可是,你只答对了一半!

的确,line 2中的&i输出的是int变量i的地址,可是,当你看到运行结果的时候,你是不是应该会很惊讶:为什么&c输出的却是一个乱码?

首先,我想先介绍一下在C++中字符串的基础知识。

在C++中,字符串是以空终止符(’\0’)结尾的字符数组,通过字符串中第一个字符的指针访问字符串。也就是说,字符串的值是字符串中第一个字符的(常量)地址。如下的面3种形式表示:

char *str=“string”;

char str2[]=“string2”;

charstr3[]={‘s’,‘t’,‘r’,‘i’,‘n’,‘g’,‘3’,’\0’};

cout<<“line 3:str=”<<str<<endl;

cout<<“line 4:str2=”<<str2<<endl;

cout<<“line 5:str3=”<<str3<<endl;

运行可知,这3行的输出就是保存的字符串的值,而并非我们认为的地址。那么,我们可以联系到前面&c,其实这就是一个char *的变量,所以,输出的自然就应该是字符串的值。可是,&c保存的字符串是没有终止符的,因此输出的也就是乱码了。

最近,在读到《C++程序设计教程》(第4版)第12章的时候,我才解决了这个疑惑。实际上,任何程序员希望输出为地址的指针变量都要作一个转换,即强制char *转换成void *,那么,char型变量和字符串的地址就可以以十六机制的格式输出了,如下所示:

cout<<"line 6:static_cast<void >(&c)="<<static_cast<void>(&c)<<endl;

cout<<"line 7:static_cast<void >(str)="<<static_cast<void>(str)<<endl;

此时,可以看到输出的结果就是char类型变量和字符串变量的地址了。

总结: 都是 cout 惹的祸!

原文链接:http://blog.csdn.net/nitpicking/article/details/45364403

指针常量和常量指针

(1)、常量的定义,const的使用

int const a=10;//定义一个int型的常量a,以后不能修改a的值
const int b=20;//定义一个int型的常量b,以后不能修改b的值
const 和 int 的位置可以互换,都表达的是相同的意思。

以下是不正确的定义

const int c;//错误,系统不会对c进行初始化为0,所以此语句没有对 c 进行初始化,不正确
const int d;//错误,没有进行初始化
d=8;//错误,对d进行了修改
总结:在const定义一个常量的时候同时要对其初始化

(2)、指针常量和常量指针

指针常量和常量指针的概念:(对于概念我很多时候傻傻分不清,只要能通过代码认清楚就好了)

首先它两都是定义了一个指针,其次指针常量指的是指针本身是常量,常量指针是被指向的对象是常量

那么定义一个常量指针(下边四条语句都是正确的定义)

const int * p1;//定义一个常量指针,系统为其指向的int型对象初始化
int const * p1;//同上
const int *p1=array;//定义一个常量指针,为其初始化为array
int const *p1=array;//定义一个常量指针,为其初始化为array
定义一个指针常量

int * const p2;//定义出错,
int * const p2=array;//定义成功
那么指针常量和常量指针的区别在哪里呢?我们做下面一个测试

int a1=10;
int a2=20;
const int * p=&a1;//定义一个常量指针,并给指针p赋值
p=&a2;//改变指针p的值,正确
p=a2;//错误,不能为指针p指向的内容赋新值
在上边一段代码中 const int * p=&a1; 这条语句定义了一个指针 p ,我们知道const int * p=&a1; 和int const * p=&a1; 是等价的, 我们把const int看成一个整体 ci ,那么 ci 就是
p 的类型,也就是 *p 的类型是 “被const修饰过的int类型”,所以 *p 是不能改变的,const 修饰的不是 p ,所以 p 是可以修改的

我们继续做一个测试

int a1=10;
int a2=20;
int * const p=&a1;
*p=30;
p=&a2;
此时const直接修饰的是 p ,因此 p 的值不能改,*p 的值可以修改~~~
那我们定义这样一个指针p呢?

const int * const p=&a1;
p 和 *p 都不能修改~~~

那下边这条最简单的语句

int * p;
p 和 *p 都是可以修改的~~~

原文链接:https://blog.csdn.net/qq_32103261/article/details/80228158

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值