char *str 和 char str[] 的区别

以前一直觉得这两个有区别,但也没深究,今天写了个代码报了警告于是就看了看,总结如下。


例如如下代码:

#include<iostream>
using namespace std;
int main()
{
    char *p1 = "abcd";
    char p2[] = "1234";
    return 0;
}

这二者的区别还在于:
1. p1是一个指针变量,有一块内存存储它,它的内容是字符串的地址,那么我们要访问字符串就先要取出p1中存储的地址,然后计算偏移量,进行访问
2. 不同于p1,p2直接是字符串的地址,直接访问就行了

“abcd”是文字常量区分配了内存存储的,栈上分配一地址给p1并指向“abcd”,那么如果在后面的代码中改变了“abcd”,自然崩溃。所以,需要加上const限定

但是说到底,为什么改变p1就是危险的,字符数组的内容就能随意改变呢?这是因为“abcd”是在编译时刻就确定的,而“1234”是在运行时刻赋值的。所以,编译器在编译时就已经知道p1指向的是常量,他并不希望你改变,但是数组不同,可以说他只是个存储的工具,编译器编译时并不知道它里面是什么。

但在往后的存取中,在栈上的数组比指针所指向的字符串是要快的。

还网上找到如下代码,很详细

int a=0;    //全局初始化区
char *p1; //全局未初始化区
main()
{
     int b;                  //栈
     char s[]="abc";  //栈
     char *p2;           //栈
     char *p3="123456";   //123456\0在常量区,p3在栈上。
     static int c=0;     //全局(静态)初始化区
     p2 = (char*)malloc(20);   //分配得来得10和20字节的区域就在堆区。
     strcpy(p1,"123456");   //123456\0放在常量区,编译器可能会将它与p3所向"123456"优化成一个地方。
 }

猜你喜欢

转载自blog.csdn.net/zwt0112/article/details/81215555