目录
字符指针
第一种使用方式
int main()
{
char ch = 'w'; //字符变量
char* pc = &ch; //pc指向一个字符变量,pc是个指针变量,pc指向的类型是一个char类型,pc指向ch,ch的类型就是char
}
ch是一个字符变量。
pc指向一个字符变量,pc是个指针变量,pc指向的类型是一个char类型,pc指向ch,ch的类型就是char 。
char是1个字节,pc是四个字节大小应该是ch的四倍
第二种使用方式
int main()
{
char* p = "hello world"; //并不是把helloworld放到指针p中去,“hello world”是一个常量字符串,存放在内存的常量区
//上面表达式的作用是:把常量字符串“hello world”的第一个字符h的地址赋值给p
printf("%c\n", *p);
//指向p就相当于指向了所有,因为这个字符串是连续的
printf("%s", p);
}
上面表达式的作用是:把常量字符串“hello world”的第一个字符h的地址赋值给p,并不是“helloworld”放到指针p中去,“hello world”是一个常量字符串,存放在内存的常量区。
因为p是char类型的,所以对p解引用只能访问到一个字节,所以只存h的地址
指向p就相当于指向了所有,因为这个字符串是连续的
通过监视我们也可以看出。
为什么字符指针存储字符串要加const?
使用字符指针存字符串的时候我们都会加上const,甚至有些编译器不加const是编译不过的,这是为什么呢?
原因就是如果直接写是非常不好的,因为"hello world"是常量字符串,是不允许修改的,但这个指针p却没有限制,p是可以随便改的,所以这就非常的危险
eg: 修改之后看似程序通过了,但仔细观察它的代码为-1073741819,这就代表着程序崩溃了
通过监视更直观的看出来
所以建议加上const,这样就可以保证这个指针不能乱修改了
笔试题
对于这样一段代码输出结果是什么呢?
int main() { char str1[] = "hello world."; char str2[] = "hello world."; char* str3 = "hello world."; char* str4 = "hello world."; if (str1 == str2) printf("str1 and str2 are same\n"); else printf("str1 and str2 are not same\n"); if (str3 == str4) printf("str3 and str4 are same\n"); else printf("str3 and str4 are not same\n"); return 0; }
答案:
问题分析及原因:
这里在比较的str1,str2实际上是在比较它们的地址 (因为数组名是首元素的地址) 而不是比较的数组里面的内容。str1和str2这两个字符数组是独立开辟空间的,它俩除了存的东西一样没有任何的关联,这两个空间既然是独立的,str1和str2存的地址肯定就不一样。所以str1和str2也就不相等。
对于str3和str4来说:因为“hello world”是常量字符串,它不能被修改,内容永远是“hello world”。所以如果有多个字符指针存它的时候,这个常量字符串存储的时候只会存储一份,因为这个字符串不能被修改,内容固定,所以多个字符指针都共用这一份就行了,否则就是浪费空间。所以str3指向h的地址,str4也指向h的地址。所以str3和str4相等。