实例:
/* -------- Pointer.cpp -------- */ #include <iostream> using namespace std; void pointerArray(); void pointerArray4Char(); const int MAX = 3; int main(void){ // pointerArray(); pointerArray4Char(); return 0; } void pointerArray(){ int var[MAX] = {20,30,40}; int *ptr[MAX]; for(int i = 0; i < MAX; i++){ ptr[i] = &var[i];//赋值为整数的地址 } for(int i = 0; i < MAX; i++){ cout << "Value of var[" << i << "] = "; cout << *ptr[i] <<endl; } } /** * 用一个指向字符的指针数组来存储一个字符串列表 * Value of names[0] = sun; */ void pointerArray4Char(){ const char *names[MAX] = { "sun","bin","sunbin" }; for(int i = 0;i < MAX;i++){ cout <<"Value of names[" << i << "] = ";//输出字符串的值 cout << names[i] << endl; cout <<"Value of *names[" << i << "] = ";//输出指针所指向字符串首地址的值 cout << *names[i] << endl; cout <<"Value of *names[" << i << "]+1 = ";//输出ascii码值 cout << *names[i]+1 << endl; cout <<"Value of *(names[" << i << "]+1) = ";//输出指针所指向字符串首地址上一位的值 cout << *(names[i]+1) << endl; } }
cout<<*names[i]<<endl; 输出结果为对应得指针数组的第一个字符,因为 *name 代表指向数组的第一个地址的值。
char *names[MAX] 是指针数组, 它的本质是存储指针的数组, 既存储 char 类型的指针的数组, 数组内的每个元素都是一个指针指向一个存储 char 类型的地址:
#include <iostream> using namespace std; const int MAX = 4; int main(int argc, const char * argv[]) { const char *names[MAX] = { "Zara Ali", "Hina Ali", "Nuha Ali", "Sara Ali", }; for (int i = 0; i < MAX; i++) { cout << " --- names[i] = " << names[i] << endl; cout << " --- *names[i] = " << *names[i] << endl; cout << endl; cout << " --- (*names[i] + 1) = " << (*names[i] + 1) << endl; cout << " --- (char)(*names[i] + 1) = " << (char)(*names[i] + 1) << endl; cout << " ------------------------------------ " << endl << endl << endl << endl; } return 0; }
#include <iostream> using namespace std; const int MAX = 3; int main() { int var[MAX] = { 10, 100, 200 }; cout << var << endl; cout << *var << endl; for (int i = 0; i < MAX; i++) { *(var+i) = i; // 这是正确的语法 cout << *(var+i) << endl; cout << i << endl; cout << &var[i] << endl; cout << var << endl; } return 0; }
上面笔记的一些补充,var++ 实际上是 var=var+1,而var是常量,不能出现在=(赋值符号)的左边,但是 *(var+i)、&var[i]都是允许的,尝试这些操作可以加深理解。上述代码运行结果:
00DBFD04 10 0 0 00DBFD04 00DBFD04 1 1 00DBFD08 00DBFD04 2 2 00DBFD0C 00DBFD04
#include <iostream> using namespace std; int main () { int var[3] = {10,100,200}; int *p=var; for (int i = 0; i < 3; i++) { cout << *(var++) << endl; //编译错误,因为var是数组名(也是数组首元素地址),不是一个变量,不可修改其值 cout << *(var+i) << endl; //编译正确,因为没有对var进行赋值,只是通过与i相加访问变量地址 cout<< *(p++)<<endl; ///编译正确,p为指针变量可赋值 } return 0; }
教程示例中的 *var = i; 实际上是改变了数组中的第一个元素的值。
证明如下:
#include <iostream> using namespace std; int main () { int ar[3] = {10,100,200}; for (int i = 0; i < 3; ++i) { *ar = i; // *ar 实际上指向的是ar中的第一个元素的地址值 cout << *ar << endl; cout << ar[i] << endl; } return 0; }
输出结果:
0 0 1 100 2 200 *ar = 0x7ffeef100bdc; ar[0] = 0x7ffeef100bdc
每次循环 *ar 都是改变了数组中第一个元素的值, 因此只有第一次输出的结果显示 ar[i] 被改变。
最后一条是输出了 *ar 和 ar[0] 的地址值, 结果显示两者地址值相同。
感谢您的支持,我会继续努力的!
支付宝扫一扫,即可进行扫码打赏哦
1979cpp-array-of-pointers
实例:
cout<<*names[i]<<endl; 输出结果为对应得指针数组的第一个字符,因为 *name 代表指向数组的第一个地址的值。
1978cpp-array-of-pointers
char *names[MAX] 是指针数组, 它的本质是存储指针的数组, 既存储 char 类型的指针的数组, 数组内的每个元素都是一个指针指向一个存储 char 类型的地址:
1977cpp-pointers-vs-arrays
上面笔记的一些补充,var++ 实际上是 var=var+1,而var是常量,不能出现在=(赋值符号)的左边,但是 *(var+i)、&var[i]都是允许的,尝试这些操作可以加深理解。上述代码运行结果:
1976cpp-pointers-vs-arrays
1975cpp-pointers-vs-arrays
教程示例中的 *var = i; 实际上是改变了数组中的第一个元素的值。
证明如下:
输出结果:
每次循环 *ar 都是改变了数组中第一个元素的值, 因此只有第一次输出的结果显示 ar[i] 被改变。
最后一条是输出了 *ar 和 ar[0] 的地址值, 结果显示两者地址值相同。