char* a 与 char a[] 以及常量指针,指针常量
来源:互联网 发布:dos操作系统和windows 编辑:程序博客网 时间:2024/05/02 00:25
常量指针与指针常量
常量指针 :指向常量值的指针,指针本身值可变,但是指针所指向的内容不可更改
指针常量:指针值是一个常量,即指针值不可变,但指针所指向的内容可以变
如:
int a = 9;int const * ptr = &a;
在这里ptr为常量指针
int a = 9;int * const ptr = &a;
此时ptr为指针常量
读法:当*在const前面时,叫做指针常量,当const在*前面时,读作常量指针
那么这两个有什么区别呢?
看下面两段代码:
#include<stdio.h>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;}
这个程序运行正常
但是去掉注释1的话,就会报错了~
当去掉注释2的话,也会报错~
因为ptr为指针常量,所以不可以更改其指针值
而p为常量指针,不可以更改其指向的内容
char* a 与 char a[]
char* a = "good";char b[20] = "good";
a是指向第一个字符’g’的指针
b是指向字符数组第一个元素’g’的指针
二者看似相同,然而并非如此
现在就让我们来揭开其神秘的面纱
#include<stdio.h>int main(void){ char* a = "helloworld"; a[0] = 'g'; return 0;}
这段代码看似没有问题,但当我们运行时,会出现如下结果:
而当代码为这样的时候:
#include<stdio.h>#include<stdlib.h>int main(void){ char a[20] = "helloworld"; a[0] = 0; system("pause"); return 0;}
其结果为:
运行正常~~
照成这一切的差异是什么呢?
字符串常量是放在常量区的,只可读。而字符数组是存在于栈中的,可以修改其数据
因此:
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[]的区别
- char* a 与 char a[] 以及常量指针,指针常量
- char数组 、char指针与字符串常量的比较
- char数组 、char指针与字符串常量的比较
- 常量指针与指针常量, char * const p与 char const * p
- const char*, char const*, char*const 的区别;指针常量,常量指针的区别
- C++指针详解char * a, char ** a, char * a[], char a[][], char * a[][], char ** a[][], char * a [][][]
- [C/C++]指针解析,char * a, char ** a, char * a[], char a[][], char * a[][], char ** a[][], char * a [][][
- 如何理解指针和数组char * a, char ** a, char * a[], char a[][], char * a[][], char ** a[][], char * a [][][]
- 指针常量与常量指针以及typedef定义的指针
- 常量指针与指针常量
- 常量指针与指针常量
- 常量指针与指针常量
- 常量指针与指针常量
- 常量指针与指针常量
- 常量指针与指针常量
- 常量指针与指针常量
- 指针常量与常量指针
- 指针常量与常量指针
- Android出现Could not find ***.apk!错误
- Git之忽略文件(ignore file)
- web开发优秀的参考资源
- Hibernate VS iBATIS
- InstrumentDriver,对iOS自动化测试说 Yes!
- char* a 与 char a[] 以及常量指针,指针常量
- Interview Question Collection
- 64位windows系统下林智仁libsvm的MATLAB安装
- 新浪微博(第一天)
- IOS用CGContextRef画各种图形(文字、圆、直线、弧线、矩形、扇形、椭圆、三角形、圆角矩形、贝塞尔曲线、图片)
- 有了自己的技术小窝
- 主流linux系统发行的官方网站
- java ArrayBlockingQueue
- url 中文传参 乱码问题