11、为什么字符串可以直接赋值给字符指针变量?

您所在的位置:网站首页 为什么字符数组可以直接输出数字 11、为什么字符串可以直接赋值给字符指针变量?

11、为什么字符串可以直接赋值给字符指针变量?

2023-12-29 00:35| 来源: 网络整理| 查看: 265

今天看到了gets()与puts()函数,发现了一个奇怪的点:字符串可以直接赋值给字符指针变量。例如以下:

char * p="EDS"; puts(p); //输出结果为EDS

学过指针让我清楚明白了指针变量是不能直接赋值的,而这里的字符指针却直接被赋值字符串。这让我深感疑惑了,经过查阅,才知道:

char * p="EDS"; 双引号在这里做了这三件事情:

1. 申请了空间(在常量区),存放了字符串 2. 在字符串尾加上了'/0'    3. 返回该字符串的首地址

先来看puts()这个函数 

函数原型 int puts(const char *string); 参数

输入:字符串指针

输入可以是字符串数组,也可以是字符串常量,例如:

char a[15]="1234"; //字符串数组 char * p="EDS"; //字符串常量 p=a; //将a的首地址赋值给p,p指向了a字符串数组 puts(p); //输出结果为1234

puts()函数的输入是一个字符串指针。当使用一个字符串数组名作为输入时,数组名此时表示一个指向数组的指针值,这符合puts()的输入要求,并能够正确输出。但是,当输入为一个字符串常量时,函数仍然能够正常的输出字符串。  理由如下: 

如上所述,双引号的加入,返回了字符串常量的地址值,即指针,这样才能够满足puts()函数对输入参数的要求,而这个指针应该指向了字符串常量实际所在的地址。 程序运行时,双引号分配了常量区空间,字符串常量将占用内存空间,这样才能保证puts()函数能通过指针找到要输出的数据。 既然字符串常量占用内存,那么应该就能够通过得到它的地址并输出。

另外看一下下面的这组区别,char a[10] = “hello”; 这是数组的初始化,和a[0] = ‘h’ a[1] = ‘e’…是一个道理,但是换成char a [10],然后a = “hello”就不行了 “hello”赋值的值是一个地址,而a虽然也有地址,但是这与指针是不一样的,指针的值是地址,而数组的值虽然也是地址,但是却是一个地址常量,所以不能给常量赋值。所以,可以把字符串赋值给指向字符指针变量p,而不能把字符串赋值给一个字符数组。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3