首先看一下C语言中下面两个语句的不同:
char s[10] = “abcde";
char *s = "abcde";
两者不同的关键点如下:
(1)数组
char s[10] = "abcde"
s是一个数组;
sizeof(s) = 10 bytes
a与&a是一样的
abcde存储在内存的栈空间中
char s[10] = "abcde";
s = "hello";这是非法的,因为a本身是一个地址,字符常量”abcde“也是一个地址
s++是非法的
char s[10] = "abcde";
a[0] = 'b';合法
(2)指针变量
char *s = "abcde"
s是一个指针变量;
sizeof(s) = 4 bytes;//32位机器
s与&s不一样
s存储在栈空间中,但是abcde存储在内存的只读区域中
char *s = "abcde";
s = "hello";合法
s++是合法的
char *s = "abcde";
a[0] = 'k';非法,"abcde"处在只读存储区
对于char s[] = "abcde",虽然我们初始化了5个元素,但是它的size是6,因为编译器会自动在末尾加'\0'。
#include <stdio.h>
int main(void)
{
char s[5] = "asdfd";
char s1[] = "adsfd";
printf("%d,%d\n",sizeof(s), sizeof(s1));
return 0;
}
输出:
5,6
char *s = "asdad",创建一个字符串字面值,对于大部分编译器来说,字符串字面值存储在内存的只读部分,修改它是非法的。s是存储字符串字面值的指针。
#include <stdio.h>
int main()
{
char *s = "adafda";
printf("%lu", sizeof(s));
// 下面这样试图去修改是非法的
// (在gcc上会导致段错误)
// s[0] = 'j';
return 0;
}
输出:8
运行上面的程序有时候会遇到提示“warning: deprecated conversion from string constant to ‘char*’",这是因为s不是一个常量指针,但是存储的确实只读区域的地址,可以修改为const char *s
基础知识:
可以看一下这篇文章,写的挺清楚的
https://blog.youkuaiyun.com/daiyutage/article/details/8604720