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