1、今天发现指针数组一个有趣的现象,众所周知,数组是基于指针而生成的,故指针和数组是可以进行相互转换,如下所示:
int num[20];
num[1] = *(num+1);
但指针和数组还是存在不同点,其中之一便是指针名称是变量而数组名称是常量:
int num[20];
int* num1 = num;
num += 1 ; // 无效,因为数组名称是常量,不允许修改。
num1 += 1 ; //有效,且指针指向num[1]
2、指针数组和数组的名称均代表第一个元素的首地址,并且带引号的字符串其也代表首地址
char ch[20] = "Lebron James"; // ch 代表 L字符的地址
char* ch1 = "Kyrie Irvring"; // ch1 代表K字符的地址 ,因为引号代表首地址,故可以将指针赋值。
3、使用cout 输出int 类数组名称得到的是首个int元素的地址,但使用cout输出char类数组名称得到的是整个char数组的元素直到遇到'\0'为止。若我们想通过char数组名输出,数组首字符所处的位置,则可以使用强制转换(int *)
int num[20] = {1,2,3,....};
char ch[20] = "tiger." ;
cout << " num = " << num << endl ; // 输出地址 如 0x .....
cout << " ch = " << ch << endl ; // 输出字符串tiger.
cout << " ch at " << (int *)ch << endl ; // 输出字符t的地址
为什么会出现输出数组名,而最终输出其存储的字符串呢,这是因为编译器会留出空间将每个被存储的字符串和其地址进行关联。