再论数组与指针
来源:互联网 发布:嘉兴南湖行知小学 编辑:程序博客网 时间:2024/06/06 23:50
话说已经好久没有进行理论知识补充了,前几天又看到一个朋友的工资上万了,到百度工作去了,真是无限仰慕啊
不废话了,再说下自己对数组的新认识吧,算是一个以前的一个误解了,今天晚上看c专家与编程,又得到了新的认识
先把代码贴出来
#include <iostream>using namespace std;int main(){ int a[10]; int *p; int i=0; for (i=0; i<10; ++i) a[i]=i; p=a; for (i=0; i<10; ++i) *p++=0; //这里*p++换成p[i] //p=a; for (i=0; i<10; ++i) cout<<"a[i]="<<a[i]<<" *p++="<<*p++<<endl; //这里一样 while (1); return 0;}
好了,大家可以预期一下结果了,
第一种: 两个数组都是0
第二种: a全部为0 如果上面加上注释的p=a话,那就是一样的了
总结一下,过去一直是数组和指针混用。就如刚刚两种形式,第二种完全是把指针当成数组了,但是却没有申请大小
以后要注意不能指针,数组混用,要不然被别人认为你什么都不懂,这算是一个新的认识吧,仅此记下。
你要是动态申请数组的话,那还是数组,指针是没有大小限制的。
下面再贴出一代码,要求读者自己思考预计结果,并分析原因
#include <iostream>using namespace std;char ga[7]={"123456"};void f1(char ca[]){ cout<<&ca<<endl; cout<<&(ca[0])<<endl; cout<<&(ca[1])<<endl;}void f2(char *pa){ cout<<&pa<<endl; cout<<&(pa[0])<<endl; cout<<&(pa[1])<<endl;}int main(){ cout<<&ga<<endl; cout<<&(ga[0])<<endl; cout<<&(ga[1])<<endl; f1(ga); f2(ga); while (1); return 0;}
下面是正确输出结果
0x43f000
123456
23456
0x22ff20
123456
23456
0x22ff20
123456
23456
1.1这里主要分析下第一个地址与后面地址为什么不同,不对,应该是后面的地址与第一个地址为什么不同
经我分析大概为: 这个是以传值方式进行的,也就是 对实参做一部分拷贝并传递给调用的函数,函数不能修改作为实参的实际变量值,而只能修改传递给他的那份拷贝
可以说 存储这份拷贝的肯定是一个新的地址,故得到上述的结果应该是情理之中的
1.2当然还有一个问题,这里数组参数的地址和数组参数的第一个元素的地址竟然不一样????
这里要注意了,输出的是 &ga 这里是地址的地址
而 &(ga[0])是值的地址
1.3最后还有一个问题,就是问什么输出的是字符串呢?
具体的大家可以看这里
这里我们改成这样就可以了
//cout<<&ga<<endl;
//cout<<(void*)&(ga[0])<<endl;
//cout<<(void*)&(ga[1])<<endl;
想想 我们用c语言 是怎么实现输出模式的,一样的这里只是一个输出样式的表达而已
printf ("%#x\n",&ga);
printf ("%#x\n",&(ga[0]));
printf ("%#x\n",&(ga[1]));
- 再论数组与指针
- 论指针与数组
- 论指针数组与数组指针
- 【论指针(4)】指针与二维数组
- 指针:指针与数组
- 指针与指针数组
- 再谈数组与指针
- 指针数组与数组指针
- 指针数组与数组指针
- 指针数组与数组指针
- 指针数组与数组指针
- 指针数组与数组指针
- 指针数组与数组指针
- 指针数组与数组指针
- 数组指针与指针数组
- 指针数组与数组指针
- 指针数组与数组指针
- 指针数组与数组指针
- How Computers Boot Up
- 面向对象设计模式原则
- tar.gz文件解压 linux
- 生成xml文件例子
- Hibernate 的四种继承关系
- 再论数组与指针
- minix masterboot解读
- joj1063
- centOs 安装rrdtool 步骤
- poj3487 稳定婚姻问题
- Android四种Activity的加载模式
- OS Boot Sequence
- 关于标识唯一性的一段测试代码
- 打造我自己的NetBSD