C语言中char s[]与char *s的不同

首先看一下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.csdn.net/daiyutage/article/details/8604720

猜你喜欢

转载自blog.csdn.net/EMH1899/article/details/84874452