1. 程式人生 > >C語言中char s[]與char *s的不同

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