char* a 与 char a[] 以及常量指针,指针常量

常量指针与指针常量

  • 常量指针 :指向常量值的指针,指针本身值可变,但是指针所指向的内容不可更改

  • 指针常量:指针值是一个常量,即指针值不可变,但指针所指向的内容可以变

如:

int a = 9;
int const * ptr = &a;

在这里ptr为常量指针

int a = 9;
int * const ptr = &a;

此时ptr为指针常量

读法:当*在const前面时,叫做指针常量,当const在*前面时,读作常量指针

那么这两个有什么区别呢?
看下面两段代码:

#include

int main(void)
{
    int a = 9;
    int b = 8;
    int c = 7;

    int * const ptr = &a;
    int const * p = &b;

    *ptr = 1;

    // 1: ptr++;   

    p = &c;

    // 2: *p = 1;

    return 0;
}

这个程序运行正常
char* a 与 char a[] 以及常量指针,指针常量_第1张图片

但是去掉注释1的话,就会报错了~
char* a 与 char a[] 以及常量指针,指针常量_第2张图片

当去掉注释2的话,也会报错~
char* a 与 char a[] 以及常量指针,指针常量_第3张图片

因为ptr为指针常量,所以不可以更改其指针值
而p为常量指针,不可以更改其指向的内容

char* a 与 char a[]

char* a = "good";
char b[20] = "good";

a是指向第一个字符’g’的指针
b是指向字符数组第一个元素’g’的指针
二者看似相同,然而并非如此

现在就让我们来揭开其神秘的面纱

#include

int main(void)
{
    char* a = "helloworld";

    a[0] = 'g';

    return 0;
}

这段代码看似没有问题,但当我们运行时,会出现如下结果:
char* a 与 char a[] 以及常量指针,指针常量_第4张图片

而当代码为这样的时候:

#include
#include

int main(void)
{
    char a[20] = "helloworld";

    a[0] = 0;

    system("pause");
    return 0;
}

其结果为:
char* a 与 char a[] 以及常量指针,指针常量_第5张图片
运行正常~~

照成这一切的差异是什么呢?
字符串常量是放在常量区的,只可读。而字符数组是存在于栈中的,可以修改其数据
因此:
char* a = “helloworld”; “helloworld”是存放于常量区,因此只可读不可写
char a[20] = “helloworld”; “helloworld”存在于栈内,可读可写

char a[20] = “helloworld”;由于存放于栈中,因此读取速度比char* a = “helloworld”快

char * a = “helloworld”在编译时便已经确定了值
char a[20] = “helloworld”则是在运行时确定的

当执行char a[] = “helloworld”;时,系统将会分配11个字节的空间,最后一个字节存放’\0’,当调用strlen(a)时得到的值为10,因此strlen()不会将’\0’计算进去

内存存储模式

静态储存区:编译时确定,用于存放常量,全局变量等
栈:用于存放变量,运行时分配
堆:动态分配,可使用new,malloc分配,需手动释放

参考文章:
char*与char[]的区别

你可能感兴趣的:(c++,c++)