一、字符指针 char *p
1.首先看最常用初始化的例子(注意初始化和赋值的区别)
char *p = "hello world";
//对于编译器而言,这里是会报警告的,warning
为什么编译器会报警告呢?
因为 “hello world” 是一个字符串常量const char *类型,当编译器编译到 "hello world" 的时候,会进行三个步骤
①将 "hello world" 存放在常量区
②存放的时候在末尾自动加上‘\0’, 即存储为“hello world\0”
③将存储字符串的内存的地址返回。即能够被字符串常量赋值的一定是指针。
而char *p中,字符指针p是存放在栈区的,但是p存储的地址(也就是“hello world”的地址)是常量区的地址,所以会报警告
那为什么不报错而只是报警告呢?因为字符指针p存储的只是 别的内存区的地址,而不是存储的 别的内存区的值,所以不会出现因生存期不同而造成内存错误
2.字符指针 char *p 允许赋值
char *p;
p = "hello world";
这没什么说的了,跟第一个解释是一样的,报警告不报错
3.写一个既不报错也不报警告的字符指针 char *p
很简单,报警告是因为内存区不一样导致的,我们只需要把它变成一样的即可
//初始化
const char *p = "hello world";//完全正确的写法
//赋值
const char *p ;
p = "hello wolrd";//完全正确的写法
二、字符数组
1.最常见的字符数组初始化
基本在写程序都会用第一种写法,因为懒......
char p[] = "hello";
char p[6] = "hello";
char p[] = {"hello"};
char p[6] = {"hello"};
char p[] = {'h', 'e', 'l', 'l', 'o'};
char p[6] = {'h', 'e', 'l', 'l', 'o'};
//以上写法完全等效,且完全正确,既不会报错也不会报警告
2.字符数组不能赋值
char p[6];
p = "hello";//错误
为什么字符数组不能赋值呢?
原因是字符数组名p其实是一个指向数组第一个元素的指针。换句话说p其实是一个指针常量,即相当于char * const p。所以字符数组只能声明即初始化,而不能声明再初始化。