話說已經好久沒有進行理論知識補充了,前幾天又看到一個朋友的工資上萬了,到百度工作去了,真是無限仰慕啊
不廢話了,再說下自己對數組的新認識吧,算是一個以前的一個誤解了,今天晚上看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]));