一、 关于char* 初始化赋值问题
- “const char*” 类型的值不能用于初始化"char *" 类型的实体
char* p = "openstack";
*p = 32; // 欲将‘o’换成0
// 错误,想让p指向字符串“openstack”,实际上可以写成:
// char *p;
// p = “openstack”;
// 当然错误,p是地址,“openstack”是字符串
有问题:编译器会报错
因为“openstack”作为字符常量不能分配给指针变量p,正确应该为:
char p[] = "openstack"; // p是一个字符数组
*p = 32;
// 或者
char* p = (char*)malloc(100 * sizeof(char)); //预先申请动态空间
strncpy(p, "openstack", 100);
*p = 32;
字符指针同样需要注意:
// 错误, p没有实际的指向'A'
char* p = 'A';
// 正确:
char* p;
char a = 'A';
p = &a;
- *p = 32,p内容变为空
#include<iostream>
#include<string>
using namespace std;
int main()
{
char p[] = "zzw";
cout << p;
*p = 32;
cout << p;
cout << "*";
cout << '\n';
system("pause");
return 0;
}
// 1.
// char p[] = "zzw"; 可以
// char* p = "zzw"; 不可以,"const char*" 类型的值不能用于初始化"char *" 类型的实体
// 2.
// char p[] = "zzw";
// *p = 32; 打印的是: " zw"
// *p = 0; 打印的是: (空)
二、 声明指针char* p; 的时候是否分配了空间
char a; // 为a分配了空间
a = 'A'; // 正确
char* p; // 为p随机分配了空间
p = &a; // 正确
*p = 'A'; // 错误
char *p; 声明p为指向字符的指针,这时为这个指针分配了存储空间。但这时其中是随机数,我们称它为指向一个不确定的内存地址。
如果“直接 *p = ‘A’,那么就会在一个无法预知的内存地址写入一个字符‘A’。这是不允许的,可能导致程序崩溃。
p=&a; 则是把已有的变量a的地址写入指针p,我们称使指针指向a. 可以通过p对变量a正常操作。
三、C语言变量声明内存分配
参考:https://www.cnblogs.com/yasmi/articles/4933842.html
参考:
https://www.cnblogs.com/yasmi/articles/4933842.html
https://zhidao.baidu.com/question/460974697.html