数组名与指针区别以及更多
2017-03-05 23:07
232 查看
sizeof(数组名)和sizeof(指针)
《C和指针》P141~142
传的是数组名,数组名不等价于地址。编译器用数组名标记数组的属性,比如具有确定数量的元素。而地址,也就是指针,只是一个标量值。只有当数组名在表达式中使用时,编译器才会为它产生一个指针常量。而只有以下两种情况,才不被当做指针常量:
sizeof(数组名):返回数组所占的字节数,不是数组元素个数,也不是指向数组的指针的长度。
//3.11注:char a[8]={“water”};sizeof(a)=8,字符串数组后未初始化元素值为’\0’
&数组名:产生一个指向数组的指针,而不是一个指向某个指针常量的指针。
数组名并不是完全等同于指针。虽然它们都可以通过指针方式访问数组。但是数组在作为函数参数传递过程中,会退化成指针。这也是为什么指针作为参数传递时,经常要一个长度。
加上sizeof是算符,strlen是函数。
也就说明了为什么,数组做sizeof的参数不退化,传递给strlen就退化为指针了。
借用一个前辈的test:
结果输出:
数组名40
指针4
在函数中4
strlen和sizeof区别总结:传送门
char *a 与char a[] 的区别 以及内存基础:链接
最后提一下,strlen是碰到字符串结束符\0就返回,但是不包括\0的
char arr[10]; sizeof(arr) =10;
《C和指针》P141~142
传的是数组名,数组名不等价于地址。编译器用数组名标记数组的属性,比如具有确定数量的元素。而地址,也就是指针,只是一个标量值。只有当数组名在表达式中使用时,编译器才会为它产生一个指针常量。而只有以下两种情况,才不被当做指针常量:
sizeof(数组名):返回数组所占的字节数,不是数组元素个数,也不是指向数组的指针的长度。
//3.11注:char a[8]={“water”};sizeof(a)=8,字符串数组后未初始化元素值为’\0’
&数组名:产生一个指向数组的指针,而不是一个指向某个指针常量的指针。
数组名并不是完全等同于指针。虽然它们都可以通过指针方式访问数组。但是数组在作为函数参数传递过程中,会退化成指针。这也是为什么指针作为参数传递时,经常要一个长度。
加上sizeof是算符,strlen是函数。
也就说明了为什么,数组做sizeof的参数不退化,传递给strlen就退化为指针了。
借用一个前辈的test:
#include<iostream> using namespace std; void fun(int *P) { cout<<"在函数中"<<sizeof(P)<<endl; } int main() { int A[10]; int* B=new int[10]; cout<<"数组名"<<sizeof(A)<<endl; cout<<"指针"<<sizeof(B)<<endl; fun(A); }
结果输出:
数组名40
指针4
在函数中4
strlen和sizeof区别总结:传送门
char *a 与char a[] 的区别 以及内存基础:链接
最后提一下,strlen是碰到字符串结束符\0就返回,但是不包括\0的
相关文章推荐
- 字符数组与字符指针的区别以及字符串常量的修改
- 一维数组和指针数组和数组指针,以及扩展到二维数组和二级指针的分析和区别
- 数组指针和指针数组的区别,以及如何利用他们访问数组里面的元素
- C 语言中的左值和右值。以及对比数组名和指针取数组元素的区别。
- 指针与数组的区别,以及函数的实现过程
- 大端和小端格式的区别,以及二维数组和指针数组的学习总结。
- linux c 中关于指针常量和常量指针以及数组的关系与区别
- putchar和printf的区别,以及数组和指针的关系理解
- 指针与数组的区别,以及指针的空间开辟问题
- 野指针的危害以及数组指针和指针数组区别
- 数组和指针的区别(a和&a以及&a[0]的区别)
- C和指针之数组名和&数组名和&首元素以及sizeof(数组名)和sizeof(数组名作为参数)区别
- 指针 与 数组 以及 a 与 &a的区别
- c语言中字符串常见初始化时的问题,以及字符串数组与指针区别的分析
- 浅谈 数组指针 指针数组 函数指针 函数指针数组... 以及它们之间区别。
- 指针数组和数组指针的区别以及main函数
- 数组和指针的比较和关系以及区别
- 1.如何避免野指针2.获取字符串的两种方法。以及malloc,calloc,ralloc的使用注意点3.二维三维数组4.数组和函数的区别
- C++ 运算符优先级 以及指针数组和数组指针的区别
- 字符串截取以及字符数组和字符指针的区别