话说已经好久没有进行理论知识补充了,前几天又看到一个朋友的工资上万了,到百度工作去了,真是无限仰慕啊
不废话了,再说下自己对数组的新认识吧,算是一个以前的一个误解了,今天晚上看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]));