簡介
該文章主要介紹char (*str)[2]與char * str[2]之間的區(qū)別儿咱,其實(shí)也就是我們經(jīng)常所說的數(shù)組指針與指針數(shù)組的區(qū)別边器。
ps:之所以選用char (*str)[2] 與 char * str[2]作為文章題目而不是數(shù)組指針與指針數(shù)組,個人認(rèn)為后者太容易搞混了梧田,感覺還是記住兩句代碼更簡單點(diǎn)。
char *str[2]
這就是我們常說的指針數(shù)組(array of pointrs)。
- 首先這是一個數(shù)組,數(shù)組中包含兩個數(shù)據(jù)
- 數(shù)組中包含的數(shù)據(jù)為char類型的指針
例程
#include <iostream>
int main()
{
char s[2] = { 'Z','K' };
char *str[2];
str[0] = &s[0];
str[1] = &s[1];
std::cout << "sizeof(str):"
<< sizeof(str) << std::endl;
std::cout << "s[0] address:" << (void*)str[0] << "\n";
std::cout << "s[1] address:" << (void*)str[1] << "\n";
system("pause");
return 0;
}
//輸出結(jié)果
sizeof(str):8
s[0] address:004FFD78
s[1] address:004FFD79
- sizeof(str):8 因?yàn)閟tr數(shù)組包含兩個指針邪蛔,所以長度是8
- 存儲的兩個地址為0x004FFD78與0x004FFD79,因?yàn)橹赶虻氖莾蓚€char,所以地址相差一個字節(jié)
char(*str)[2]
這就是常說的數(shù)組指針(a pointer to an array).
- 首先它是一個指針
- 該指針指向一個char[2]的數(shù)組,且只能指向一個char[2]的數(shù)組
例程
#include <iostream>
int main()
{
char s[2] = { 'Z','K'};
char (*str)[2];
str = &s; //注意這里的&符號扎狱,這里我們把s[2]作為一個整體侧到,當(dāng)取址的時候,需要使用取址符
std::cout << "sizeof (*str):" << sizeof(str) << "\n";
std::cout << "s[0] address:" << (void*)&s[0] << "\n";
std::cout << "str:" << str << "\n";
std::cout << "str+1:" << (str + 1) << "\n";
system("pause");
return 0;
}
//輸出結(jié)果
sizeof (*str):4
s[0] address:0026F950
str:0026F950
str+1:0026F952
- sizeof(*str):4 因?yàn)閟tr只是一個指針而已淤击,所以長度為4
- str所存儲的地址與s[0]的地址是相同的匠抗,為char[2]的首地址
- str+1得到的結(jié)果與str相差兩個字節(jié),因?yàn)閟tr指向的是一個數(shù)組污抬,所以當(dāng)指向加1操作的時候汞贸,相加的值為數(shù)組的總長度