char char* char []的理解,(內存中的指針與數組)


一、C中的內存與變量的關系

內存中存在三個段,分別為Text,Bss,Data.

1.Text段

用於存放代碼的

2.Bss段

用於存放未初始化的全局變量和靜態變量

3.Data段

分為三個小段

a.靜態區:用於存放初始化的全局變量,靜態變量和常量(如字符常量)。

b.棧:用於存放一般的局部變量。

c.堆:用於存放動態分配的變量。

二、char *的理解

#include <stdio.h>
int main()
{
    char *p = "sample";
    *(p + 4) = '1';
  return ;
}

這一段代碼可以通過編譯,但是程序運行的時候會在*(p+4)='1';這一段的時候崩潰,崩潰的原因在於char*定義的p是在棧中分配的一個指針,sample”是一個在靜態區分配了一塊常量區,指針p指向了這塊常量去,常量去是無法進行數據的更改的,所有在試圖更改“sample”的時候程序會崩潰。

三、char[]的理解

#include <stdio.h>
int
main() { char a[] = "sample"; a[1] = 'b'; printf("a=%s\n", a); return 0; }

程序可以正常運行,可以發現數組a的值成功的被改成了“sbmple”。但是當我們對數組指針a進行復制的時候,程序就無法編譯通過了。

#include <stdio.h>
int main()
{
    char a[] = "sample";
    a[1] = 'b';
    printf("a=%s\n", a);
    char b[] = "book";
    a = b;
    return 0;
}

編譯的結果是 a必須為可修改的值。產生這樣的原因可以簡單的理解數組的定義過程就是 a是一個指針常量,無法修改,而它指向的一段內存卻是在棧區分配的,可以進行修改,是固定大小的一塊內存,以‘\0’結尾。

三、char* 與char[]

可以通過一段小程序來理解他們直接的而不同

#include <stdio.h>
#include <stdlib.h>
#include<malloc.h>
#include <string.h>

int main()
{
    char *c1 = "abc";
    char *c4="abc";
    char c2[] = "abc";
    char *c3 = (char*)malloc(3);
    // *c3 = "abc" //error
    strcpy(c3, "abc");
    c3[0] = 'g';
    printf("%d %d %s\n", &c1, c1, c1);
    printf("%d %d %s\n", &c4, c4, c4);
    printf("%d %d %s\n", &c2, c2, c2);
    printf("%d %d %s\n", &c3, c3, c3);
    getchar();
    return 0;

}

 

輸出結果:

6356748 4206628 abc
6356744 4206628 abc
6356740 6356740 abc
6356736 40381328 gbc

由輸出結果我們可以看出,c1,和c4指向同一塊內存,但他們的自身所在的位置是不同的。char* 和char[]初始化的地址也是不相同的。數值指針所在位置就是自己所指向的內存(有點繞,就是不可以改變的)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM