C++ 指針/數(shù)組
本篇主要記錄一下之前工程中遇到的關(guān)于數(shù)組和指針問題,本篇主要有一下幾個重點
1. 指針
2. 數(shù)組和指針的區(qū)別,以及數(shù)組作為參數(shù)傳遞時的問題
3. 字符數(shù)組和string
指針
首先看看下面的代碼
int testPoint()
{
int i[] = {100, 200, 300, 400, 500};
int *p = i;
printf("*p = %d\n", *p);
printf("...%d\n", (*p)++);
printf("*p = %d\n", *p);
printf("...%d\n", *p++);
printf("*p = %d\n", *p);
printf("...%d\n", *++p);
printf("*p = %d\n", *p);
printf("...%d\n", ++*p);
printf("*p = %d\n", *p);
*p++;
*p++;
printf("*p = %d\n", *p);
*p++;
printf("*p = %d\n", *p); //出界限
return 0;
}
上面的輸出能完全的理出來嗎?
結(jié)果我就不展示的容诬,可以拷貝了自己驗證一下結(jié)果。這就是指針的一些操作
再看看下面的代碼
void testInt()
{
int i = -10;
int *p = &i;
cout << i << " " << ~i << " " << sizeof(i) << " " << sizeof(p) << " " << sizeof(*p) << endl;
p = new int[10];
cout << sizeof(p) << " " << sizeof(*p) << " " << sizeof(&p) << " " << p[0] << endl;
}
上面的結(jié)果了?輸出如下
-10 9 4 8 4
8 4 8 12391472
- 先分析第一行的輸出
- -10取反為什么是9? 以及-10二進制表現(xiàn)形式是怎么樣的杨凑,這個涉及到原碼、補碼和反碼摆昧,可以自己去了解了解
- i是int型的撩满,所以對應(yīng)長度就是4個Byte
- p是指針,本質(zhì)就是一個地址,而地址其實就是一個數(shù)字绅你,而其長度應(yīng)該根據(jù)系統(tǒng)使用的地址長度了伺帘,我的是64位,就是8個Byte
- *p就不用說了忌锯,解運算伪嫁,代表其實就是i
- 第二行
指針這會兒指向了一個數(shù)字,看結(jié)果沒有發(fā)生變化偶垮,說明指針不管指向什么张咳,除了具體的地址值,是不會影響指針本身的特性的
指針一個重要的示例
long *fellow;
*fellow = 2333;
上面的代碼有問題似舵?為什么
上述代碼是錯誤的脚猾,因為指針申明后,他本身是沒有意義的砚哗,必須要讓他指向一個地址龙助,上述代碼,是很嚴重的bug, 等于給一個未知的地址賦值
指針和數(shù)組
之前在學校學的時候蛛芥,把指針和數(shù)組混為一談提鸟,其實誤導了很多,數(shù)組和指針還是有去別的
先看下面的示例仅淑,對輸出結(jié)果有數(shù)嗎称勋?
void testStr()
{
char num[] = "TESTS";
char *p = num;
cout << sizeof(num) << " " << sizeof(*num) << " " << sizeof(&num) << " " << sizeof(char) << " " << strlen(num) << " " << num[0] << endl;
cout << sizeof(p) << " " << sizeof(*p) << " " << sizeof(&p) << " " << sizeof(char) << " " << strlen(p) << " " << p[0] << endl;
}
看結(jié)果
6 1 8 1 5 T
8 1 8 1 5 T
發(fā)現(xiàn)什么了?區(qū)別就在sizeof()去取大小的時候漓糙,數(shù)組和指針是不一樣的铣缠,指針大小前面已經(jīng)提到了,而數(shù)組就是數(shù)組自身的長度昆禽。
這里還涉及到一個字符數(shù)組的問題,你會發(fā)現(xiàn),我們聲明的一個字符串,是五個字符,而字符數(shù)組居然長度是6,這是因為,字符數(shù)組需要一位'\0'來標識結(jié)束.
- 做形參問題
void main(){
char num[] = "TESTS";
char *p = num;
testStr1(num);
testStr2(p);
}
void testStr1(char num[])
{
cout << sizeof(num) << " " << sizeof(*num) << " " << sizeof(&num) << " " << sizeof(char) << " " << strlen(num) << " " << num[0] << endl;
}
void testStr2(char *p)
{
cout << sizeof(p) << " " << sizeof(*p) << " " << sizeof(&p) << " " << sizeof(char) << " " << strlen(p) << " " << p[0] << endl;
}
來猜猜上面的結(jié)果
8 1 8 1 5 T
8 1 8 1 5 T
這兩個居然輸出一摸一樣了!
這是因為,數(shù)組做形參的時候,直接退化成了一個指針,而且你會發(fā)現(xiàn),編譯的時候,其實也會有錯誤提示提醒你改成指針.
datatype.cpp: In function 'void testStr1(char*)':
datatype.cpp:83:20: warning: 'sizeof' on array function parameter 'num' will return size of 'char*' [-Wsizeof-array-argument]
cout << sizeof(num) << " " << sizeof(*num) << " " << sizeof(&num) << " " << sizeof(char) << " " << strlen(num) << " " << num[0] << endl;
^
datatype.cpp:81:24: note: declared here
void testStr1(char num[])
注意
對于字符串比較特殊,其長度可以通過結(jié)束標識來計算出來,所以正常情況下,我們傳數(shù)組指針的時候,還需要額外的形參去標識一個數(shù)組的長度