C++中数组名和指针的区别联系
2012-12-16 21:01
381 查看
第一个结论:
#include "iostream.h"
void main()
{
1、 char str[]="abcdef";
2、int n[]={1,2,3,4,5};
3、char *p=str;//
4、 cout<<sizeof(str)<<endl;一个字母在内存中占一个字节,这里输出7,7个字节但是6个字母,原因是字符串后面有一个‘\0’结束符,也占一个字节
5、cout<<sizeof(n)<<endl;一个int数据在内存中占用4个字节,输出4*5=20
6、cout<<sizeof(p)<<endl;输出4
7、p++;
8、str++;
}
7
20
4
看似指针和数组名是相同的,其实不然;第4行和第6行输出结果不同就是证明,前者是字符数组长度7,而指针在32位机中是一个DWORD,4个字节,在64位中就是8了。
第二个结论:
第8句存在的话会编译报错,也就是数组名不能自加和自减,而指针可以。
(1)数组名的内涵在于其指代实体是一种数据结构,这种数据结构就是数组;//************这才是实质
(2)数组名的外延在于其可以转换为指向其指代实体的指针,而且是一个指针常量;//********code
(3)指向数组的指针则是另外一种变量类型(在WIN32平台下,长度为4),仅仅意味着数组的存放地址!//********code
第三个结论:数组名失去原本内含,沦为指针。可以做自增自减操作。
#include "iostream.h"
void Fun(char str[]);
void main()
{
1、 char s[6];
2、 Fun(s);
}
void Fun(char str[])
{
cout<<sizeof(str)<<endl;
}
第2句的结果不再是6,而是指针大小4.
分析一个别人提问的例子:
#include "iostream.h"
void main()
{
int a[]={1,2,3,4,5};
int *ptr=(int *)(&a+1);//&a是不是取地址,还是引用?
cout<<*(ptr-1)<<endl;
cout<<*(ptr)<<endl;
}
最终输出结果:5.
解释1:a是一个数组名,上面说的,数组是一个数据结构;并且a已经能代表数据结构(本数组)的地址了,于是&a是对数据结构取地址,取得的地址+1会怎么样?会指向下一个数据结构,但是这里只有一个数据结构。。。那么int *ptr=(int *)(&a+1);执行后ptr指向数据结构(int[5]的数组)的结束,a是数组,&a 就是指向数组的指针,&a+1所以位移5个int,*(ptr-1)又是int* 反位移1个,5-1=4,位移4位就是第五个数
解释2:a是一个int[5]类型,所以&a+1就会到数组末尾,再减1就是5的位置
#include "iostream.h"
void main()
{
1、 char str[]="abcdef";
2、int n[]={1,2,3,4,5};
3、char *p=str;//
4、 cout<<sizeof(str)<<endl;一个字母在内存中占一个字节,这里输出7,7个字节但是6个字母,原因是字符串后面有一个‘\0’结束符,也占一个字节
5、cout<<sizeof(n)<<endl;一个int数据在内存中占用4个字节,输出4*5=20
6、cout<<sizeof(p)<<endl;输出4
7、p++;
8、str++;
}
7
20
4
看似指针和数组名是相同的,其实不然;第4行和第6行输出结果不同就是证明,前者是字符数组长度7,而指针在32位机中是一个DWORD,4个字节,在64位中就是8了。
第二个结论:
第8句存在的话会编译报错,也就是数组名不能自加和自减,而指针可以。
(1)数组名的内涵在于其指代实体是一种数据结构,这种数据结构就是数组;//************这才是实质
(2)数组名的外延在于其可以转换为指向其指代实体的指针,而且是一个指针常量;//********code
(3)指向数组的指针则是另外一种变量类型(在WIN32平台下,长度为4),仅仅意味着数组的存放地址!//********code
第三个结论:数组名失去原本内含,沦为指针。可以做自增自减操作。
#include "iostream.h"
void Fun(char str[]);
void main()
{
1、 char s[6];
2、 Fun(s);
}
void Fun(char str[])
{
cout<<sizeof(str)<<endl;
}
第2句的结果不再是6,而是指针大小4.
分析一个别人提问的例子:
#include "iostream.h"
void main()
{
int a[]={1,2,3,4,5};
int *ptr=(int *)(&a+1);//&a是不是取地址,还是引用?
cout<<*(ptr-1)<<endl;
cout<<*(ptr)<<endl;
}
最终输出结果:5.
解释1:a是一个数组名,上面说的,数组是一个数据结构;并且a已经能代表数据结构(本数组)的地址了,于是&a是对数据结构取地址,取得的地址+1会怎么样?会指向下一个数据结构,但是这里只有一个数据结构。。。那么int *ptr=(int *)(&a+1);执行后ptr指向数据结构(int[5]的数组)的结束,a是数组,&a 就是指向数组的指针,&a+1所以位移5个int,*(ptr-1)又是int* 反位移1个,5-1=4,位移4位就是第五个数
解释2:a是一个int[5]类型,所以&a+1就会到数组末尾,再减1就是5的位置
相关文章推荐
- C++中数组名和指针的区别联系
- C/C++语言中指针数组和数组指针比较区别
- [收藏]C/C++数组名与指针区别深层探索
- c语言中数组名和指针的区别联系
- C/C++数组名与指针区别深层探索
- C/C++数组名与指针区别深入探索
- C/C++数组名与指针区别深层探索
- C/C++数组名与指针区别
- c++ 指针 数组区别
- 指针与数组的联系与区别
- 字符串,字符数组,字符指针的区别与联系
- C/C++数组名与指针区别深入探索
- C/C++数组名与指针区别深入探索
- 指针与数组的区别和联系
- More Effective C++----(1)指针与引用的区别 & (2)尽量使用C++风格的类型转换 & (3)不要对数组使用多态
- C++中int *p[4]和 int (*q)[4]的区别 (指针数组和数组指针)
- 从C++指针定义字符串和数组定义字符串区别到C++堆和栈区别
- C/C++数组名与指针区别深入探索
- c++之引用和指针的区别和联系
- C/C++数组名与指针区别深入探索