(笔记)char * p与 char p[ ] 的区别
来源:互联网 发布:淘宝双快递选择 编辑:程序博客网 时间:2024/05/16 23:41
简单的代码:
#include <stdio.h>int main(){ char * a = "abcdef"; char * b = "abcdef"; char c[] = "abcdef"; char d[] = {'a','b','c','d','e','f'}; printf("%10d\n",sizeof(a)); printf("%10d\n",sizeof(b)); printf("%10d\n",sizeof(c)); printf("%10d\n",sizeof(d)); printf("%10x%10x\n",a,b); return 0;}//运行结果:// 4// 4// 7// 6// 8048520 8048520
分析:
一. 从声明的对象
char c[ ] = “abcdef”;
是声明一个字符数组并对其初始化,可以理解为 char c[ ]= {‘a’,’b’,’c’,’d’,’e’,’f’,’\0’};
所以c[ ] 和 d[ ]区别在于数组结尾没有‘\0’。所以sizeof(c)为7,sizeof(d)为6。
char * a = “abcdef”语句
是声明一个指针,并对指针赋值。相当于:
char * a; // 所以sizeof(a)为4(32位机器) a = "abcdef"; // p指向字符串"abcdef"的首地址
二. 存放的位置
char c[ ] = "abcdef"; //作为局部变量存放在 栈区char * a = "abcdef"; //"abcdef"是存放在静态代码块中的,是全局的, a仅仅是一个指针指向"abcdef" //所以printf("%10x%10x\n",a,b);的结果是相同的 //相当于:const char * a = "abcdef";
它跟我们用static修饰的变量存放的位置是一样的
char c[] = “abcdef”; 的”abcdef”是存放在静态代码块中的
例子:
#include "stdio.h"char * get_string_1(){ char p[] = "hello world!"; return p;}char * get_string_2(){ char * p = "hello world!"; return p;}int main(){ char * p; p = get_string_1(); printf("get_string_1:%s/n",p); p = get_string_2(); printf("get_string_2:%s\n",p); return 0;}
输出:
get_string_1:(乱码或者没有输出),Linux下没有任何输出
get_string_2:hello world!
为什么会这样?
原因:C函数执行完之后对栈区进行清除操作,对静态数据区和堆则没有,
因此问题也就不难解释了,get_string_1()函数执行完就释放了栈区内存,
所以根本就不存在存有”hello world!”声明时的内存,也就不可能有所输出。
三. 写成char * p = "abcdef";
到底合不合法?能不能这样写?
这是一个历史问题,在const关键字被引入C语言之前,这样写是合法的,而且存在了很长的一段时间,大量的代码在此期间运用了这种写法,新版C语言为了兼容,故允许这样写,但最好不要这样,因为这种写法终会被淘汰,说不定哪天你的代码用了新版的编译器,然后莫名的出了问题,要找这个BUG估计不是一件容易的事。
char * p = "abcdef"; // p是指针,指向字符串常量"abcdef"
所以现在最好写成:
const char * p = "abcdef";
或者
char p[] = "abcdef";
0 0
- (笔记)char * p与 char p[ ] 的区别
- char *p 与 char p[]的区别
- 解析char *p与char p[] 区别
- char *p 与char p[]区别,strcpy_s
- char *p 与 extern char*p区别
- 解析char *p与char p[] 区别
- char *const p;与 const char * p;的区别
- 编程:char *const p;与 const char * p;的区别
- 函数参数为 "char* p" 与 "char*& p" 的区别
- const char *p与char * const p的区别
- char *const p 与 const char * p 的区别
- const char *p;与char * const p;的区别
- char *const p;与 const char * p;的区别
- 函数参数为 "char* p" 与 "char*& p" 的区别
- char *p和 char p[]的区别
- char *p和 char p[]的区别?
- char* p 和 char p[] 的区别
- char* p与char p[]的不同
- Spring Data Jpa 实体类自动创建数据库表失败解决
- web前端-CSS 分组和嵌套-015
- akka remote
- fedora下java可用,javac不可用的解决方案
- IDA 导入jni.h
- (笔记)char * p与 char p[ ] 的区别
- 安装pip
- fileupload上传文件时带参数
- Mysql 面试宝典
- Tomcat配置Https
- java 文件及文件夹拷贝--进度条
- python练习题目
- rtmp之csid 乱谈
- Window实用技巧