C语言中, 有些时候数值名并不与指针等价.
来源:互联网 发布:hadoop大数据平台构建 编辑:程序博客网 时间:2024/04/28 00:42
以前已经都提过了, c语言中,数组名就是1个指向数组第1个元素地址的指针.
如数组char a[] = "bcd";
数组名a 就是指向数组a[]的第1个元素a[0]的地址
所以*a==a[0]=='b'
当我们定义1个新的指针p,并给它赋值时:
p=a;
一般来讲我们认为他们p与a是等价的
因为同样有: *p==p[0]='b'
p[i]=a[i]
但是有特殊情况, 要将数组名a看成1个特殊的指针.
例如函数sizeof , 这是取1个对象(变量or常量) 的内存占用空间
举个例子:
定个1个字符数组c:
char c[]="abcdefghikjlmn";
那么sizeof(c) 得出的是数组c的所占内存空间,也就是c所有元素占的长度(包括最后的隐藏元素'\000').
所以
sizeof(c) == 15 //因为c是字符数组, 每1个字符占的长度是1字节(byte)啦
跟着定义1个指针p,并赋值:
p=c;
而size(p) 是求p本身所占的内存空间, 也就是1个内存单位
sizeof(p) == 8 // 64位gcc, 32位gcc是4, 因为对于每1个内存单位来讲,64位的内存单位长度是32位的一倍.
那么数组c 是不是容易都是特殊指针呢. 不是, 当他作为1个参数被传入时, 系统会将这个参数转为一般化指针:
例如我定义1个新函数:
long int getlen(char* a){
return sizeof(a);
}
执行 getlen(c) 时, 实际是也会执行size(c), 但是因为这时数组名c作为参数已经被转为一般的函数, 所以getlen函数里面的sizeof(c)求的是c指针本身所占的内存空间, 也就是8啦.
见如下例子:
输出:
如数组char a[] = "bcd";
数组名a 就是指向数组a[]的第1个元素a[0]的地址
所以*a==a[0]=='b'
当我们定义1个新的指针p,并给它赋值时:
p=a;
一般来讲我们认为他们p与a是等价的
因为同样有: *p==p[0]='b'
p[i]=a[i]
但是有特殊情况, 要将数组名a看成1个特殊的指针.
例如函数sizeof , 这是取1个对象(变量or常量) 的内存占用空间
举个例子:
定个1个字符数组c:
char c[]="abcdefghikjlmn";
那么sizeof(c) 得出的是数组c的所占内存空间,也就是c所有元素占的长度(包括最后的隐藏元素'\000').
所以
sizeof(c) == 15 //因为c是字符数组, 每1个字符占的长度是1字节(byte)啦
跟着定义1个指针p,并赋值:
p=c;
而size(p) 是求p本身所占的内存空间, 也就是1个内存单位
sizeof(p) == 8 // 64位gcc, 32位gcc是4, 因为对于每1个内存单位来讲,64位的内存单位长度是32位的一倍.
那么数组c 是不是容易都是特殊指针呢. 不是, 当他作为1个参数被传入时, 系统会将这个参数转为一般化指针:
例如我定义1个新函数:
long int getlen(char* a){
return sizeof(a);
}
执行 getlen(c) 时, 实际是也会执行size(c), 但是因为这时数组名c作为参数已经被转为一般的函数, 所以getlen函数里面的sizeof(c)求的是c指针本身所占的内存空间, 也就是8啦.
见如下例子:
输出:
下面这个是相同代码在32位gcc环境下的输出:
- C语言中, 有些时候数值名并不与指针等价.
- c语言中指针与数组名
- C语言指针与数组名
- C语言函数名与函数指针
- C语言函数名与函数指针
- C语言->数组名与指针
- C语言指针与数组名
- C语言中的数组名与指针
- C语言数组名与指针
- 【C语言提高16】数组中括号与指针关系和数组名常量指针分析
- c语言中数组名与指针的区别与联系
- 那么, 在C 语言中“指针和数组等价” 到底是什么意思?
- c语言学习零碎整理(9):传值调用,并不简单(特别是有指针的时候)
- C语言中与指针相关问题——论数组名和数组名取地址的关系
- C语言函数名与函数指针详解
- C语言函数名与函数指针详解
- C语言函数名与函数指针详解
- C语言函数名与函数指针详解
- 数据结构--折半查找法 详解
- linux GDB 简单用法以及例子
- 关于一维数组和二位数组的数组指针
- linux 关于减号 - 代替stdin 和stdout 的用法
- C 语言里的字符串---字符数组
- C语言中, 有些时候数值名并不与指针等价.
- 哈希表基本原理详解
- 详解为什么32位系统只能用4G内存.
- Ubuntu 迁移 /tmp 到别的硬盘
- 重装windows后 用live cd修复ubuntu启动gurb
- Ubuntu/Fedora 编译内核教程
- 解决Fedora 自己编译的内核不能运行Virtualbox的问题。
- linux 编译内核几个常见问题解决方法
- PGA内存作用和构成