深入理解《字符指针与字符数组真正的区别》

来自: http://blog.csdn.net/on_1y/article/details/13030439 (这篇介绍的非常到位和透彻!!!)

char *p="hello";
char q[]="hello";
char *r = (char*)malloc(sizeof(char)*6);

我们知道,字符指针和字符数组,都可以用来存储和表达字符串。

但,它们的实现方式是不同的! 下面,从代码初始化的角度,来分别说明。

(1)  char *p="hello";

对于p本身,它是一个局部变量,位于 user stack 区域。

p指向的 “hello” 是一个固定的,不可改变的常量,具有静态存储连续性数组类型,C++称它为“string literal”,位于.rodata 区域(位于该区域的数据是read-only)

变量p中存储的是“hello”的首地址

(2) char q[]="hello";

对于q本身,位于 user stack 区域。

q表示的是一个数组,存储的是一个固定不可改变的常量:为数组对应内存空间的首地址。也就是说q是一个指针常量

数组对应的内存单元位于 user stack 区域,在初始化时,编译器计算出数组大小,然后将“hello”中的字符存储到数组中对应的单元。

(3) char *r = (char*)malloc(sizeof(char)*6)

对于r本身,位于 user stack 区域。

r指向的内存单元,位于run-time heap中。 因为malloc、new等在运行时开辟的内存都位于heap中。

具体位置如下图。

并行 VS 并发

未初始化和非法指针。

指针和数组的问题。。。。*p cout is t, p=="tencent" is ok,

时间: 2024-08-01 19:01:06

深入理解《字符指针与字符数组真正的区别》的相关文章

字符指针与字符数组

学了挺久的c语言,c语言有意思的就有指针这一大块,另外就是字符串,字符指针与字符数组的区别对于初学者应该是比较难以区分的,讲讲自己的看法. 1.定义上的区别 字符数组具有固定的地址,且字符数组的名字不能更改或运算. 字符指针是一个变量,用来存储首字符的地址,且指向的字符串通常为一个常量. char str[] = "helloworld"; str[4] = 'X'; printf("%s",str); 输出结果:hellXworld char *str = &qu

字符指针和字符数组

2017年12月19日17:12:10字符指针和字符数组的整理 1.字符数组是由若干个元素组成,每个元素中存放的是一个字符,而字符指针变量中存放的是第一个字符的地址 2.char * a;a = "I love China";指针变量可以赋值,但是数组名不可以这样赋值. char a[12]; a[0]='I';合法的. a = "I love China";//不合法!!! 3.char *p = "I love China";//定义指针变量

关于字符指针和字符数组初始化的问题

int main() { char a[6]="hello"; char b[6]="hello"; char* c="hello"; char* d="hello"; //*(c+1)='!';出错 if(a==b) cout<<"1"<<endl; if(c==d) cout<<"2"<<endl; return 0; } 该题输出的是

字符指针,字符数组,双引号的字符串的区别与联系

作者 :  陈宗权 先说说双引号的字符串,比如"chenzongquan",它是由里面咱们看到的一系列字符以及一个尾随的'\0'字符组成,存储在内存的只读存储区中.只读存储区是在整个程序运行期间都保留着的.可见的,而且其中的数据原则上是保持不变的.所以对一个双引号表示的字符串,只要你知道它的具体地址,可以在程序的任何一个函数中再次使用. 说到只读,要引一下,在16位系统中没有进行内存访问保护,所以在程序运行时实际上也可以改变只读存储区中的数据,但是在32位系统中有内存访问保护,程序运行

字符串常量与 字符指针,字符数组

1. 字符串的定义(1) char buf[10] = "hello"; //定义了10个字节的数组,但只用了6个字节存放字符串(2) char *str = "hello"; //此处hello是字符串常量,存储在长常量区,把首地址传给指针变量 sts(3) char *s = "hello"; // 指针s 与 指针str的内容都是指向字符串常量“hello” 其值相等:(4) char buff[] = "hello";

返回“字符串常量的指针”和“返回数组名”的区别

char*getmemory(void) { char p[]=”hello world”; return p; } void test(void) { char *str=NULL; str=getmemory(); printf(str); } 问:运行Test 函数会有什么样的结果? 由于数组p是栈上数据,返回数组名就是返回栈内存即动态数据区的地址,函数结束会被释放,所以返回的地址也就指向了不确定的位置了,str就成了乱码! 如果改成: char*getmemory(void) { cha

转:字符数组与字符指针

转自:http://blog.csdn.net/qiumm/article/details/5657120 1.字符指针可以指向一个字符串. 我们可以用字符串常量对字符指针进行初始化.例如,有说明语句: char *str = "This is a string."; 是对字符指针进行初始化.此时,字符指针指向的是一个字符串常量的首地址,即指向字符串的首地址. 这里要注意字符指针与字符数组之间的区别.例如,有说明语句: char string[ ]="This is a st

字符数组与字符指针的区别与联系

1.字符指针可以指向一个字符串. 我们可以用字符串常量对字符指针进行初始化.例如,有说明语句: char *str = "This is a string."; 是对字符指针进行初始化.此时,字符指针指向的是一个字符串常量的首地址,即指向字符串的首地址. 这里要注意字符指针与字符数组之间的区别.例如,有说明语句: char string[ ]="This is a string."; 此时,string是字符数组,它存放了一个字符串. 字符指针str与字符数组str

关于C中字符数组,字符指针以及C++中string类型的两两转换及排序

// practise.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <string.h> #include <string> #include <algorithm> #include <iostream> using namespace std; int main() { /* 字符串转字符数组,使用strncpy_s(),比strncpy()安全*/ string str