C++ 教程 在线

1979cpp-array-of-pointers

实例:

/* -------- 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 代表指向数组的第一个地址的值。

1978cpp-array-of-pointers

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;
}

1977cpp-pointers-vs-arrays

#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

1976cpp-pointers-vs-arrays

#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;
}

1975cpp-pointers-vs-arrays

教程示例中的 *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] 被改变。

最后一条是输出了 *arar[0] 的地址值, 结果显示两者地址值相同。