33 通过指针引用字符串
点击蓝字
关注我们
DRAGON BOAT FESTIVAL
01 字符串的引用形式
在C程序中,字符串是存放在字符数组中的。
用字符数组存放一个字符串,可以通过数组名和下标引用字符串中的一个字符,也可以通过数组名和格式声明%s输出该字符串。
用字符指针变量指向一个字符串常量,通过字符指针变量引用字符串常量。
通过字符数组名或字符指针变量可以输出一个字符串,而对一个数值型数组,是不能企图用数组名输出它的全部元素的。
02 字符指针作函数参数
如果想把一个字符串从一个函数“传递”到另一函数,可以用地址传递的方法,即用字符数组名作参数,也可以用字符指针变量作参数。
在被调用的函数中可以改变字符串的内容,在主调函数中可以引用改变后的字符串。
字符串字面值常量作为右值时,就是这个字符串对应的字符数组的名称,也就是这个字符串在内存中的地址。
char* msg = "Hello world";
int main(void)
{
int num = 97;
int *p1 = #
char* p2 = (char*)(&num);
printf("%d",*p1); //输出 97
putchar(*p2); //输出 a
return 0;
}
指针的值:很好理解,如上面的num 变量 ,其地址的值就是0028FF40 ,因此 p1的值就是0028FF40。数据的地址用于在内存中定位和标识这个数据,因为任何2个内存不重叠的不同数据的地址都是不同的。
指针的类型:指针的类型决定了这个指针指向的内存的字节数并如何解释这些字节信息。一般指针变量的类型要和它指向的数据的类型匹配。
由于num的地址是0028FF40,因此p1 和 p2的值都是0028FF40
*p1 : 将从地址0028FF40 开始解析,因为p1是int类型指针,int占4字节,因此向后连续取4个字节,并将这4个字节的二进制数据解析为一个整数 97。
*p2 : 将从地址0028FF40 开始解析,因为p2是char类型指针,char占1字节,因此向后连续取1个字节,并将这1个字节的二进制数据解析为一个字符,即'a'。
同样的地址,因为指针的类型不同,对它指向的内存的解释就不同,得到的就是不同的数据。
03 使用字符指针变量和字符数组的比较
字符数组由若干个元素组成,每个元素中放一个字符,而字符指针变量中存放的是地址(字符串第1个字符的地址),绝不是将字符串放到字符指针变量中。
赋值方式。可以对字符指针变量赋值,但是不能对数组名赋值。
初始化的含义。对字符指针变量赋初值。
存储单元的内容。编译时为字符数组分配若干个存储单元,以存放各元素的值,而对字符指针变量,只分配一个存储单元(Visual C++为指针变量分配4个字节)。
指针变量的值是可以改变的,而数组名代表一个固定的值(数组首元素地址),不能改变。
字符数组中各元素的值是可以改变的,但字符指针变量指向的字符串常量中的内容时不可以被取代的。
引用数组元素。对字符数组可以用下标法引用一个数组元素,也可以用地址法。
用指针变量指向一个格式字符串,可以用它代替printf函数中的格式字符串。
球分享
球点赞
球在看