名词解释
指针数组,顾名思义是一个数组,其中每个元素都是一个指针,可以指向任何类型的数据。换句话说,指针数组是一个元素为指针的数组。
举例
int* ptrArray[3];
这个数组有三个元素,每个元素都是一个 int* 类型的指针,可以分别指向一个 int 类型的变量。
实例分析一
#include <iostream>
int *ptr[MAX];
using namespace std;
const int MAX = 3;
int main ()
{
int var[MAX] = {10, 100, 200};
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;
}
return 0;
}
输出结果为:
Value of var[0] = 10
Value of var[1] = 100
Value of var[2] = 200
实例分析二
#include <iostream>
using namespace std;
const int MAX = 4;
int main ()
{
const char *names[MAX] = {
"Zara Ali",
"Hina Ali",
"Nuha Ali",
"Sara Ali",
};
for (int i = 0; i < MAX; i++)
{
cout << "Value of names[" << i << "] = ";
cout << names[i] << endl;
}
return 0;
}
这里的names[i]是指针,指向了字符串常量,cout 将根据指针所指向的内存地址输出字符串的内容
输出结果为:
Value of names[0] = Zara Ali
Value of names[1] = Hina Ali
Value of names[2] = Nuha Ali
Value of names[3] = Sara Ali
如果代码为cout << *names[i] << endl;
运行结果为:
Value of names[0] = Z
Value of names[1] = H
Value of names[2] = N
Value of names[3] = S
由于指针数组 names 的元素是指向字符串常量的指针,因此 *names[i] 实际上获取了每个字符串的第一个字符。
小结
两个例子中:第一种赋值方式是将数组元素的地址赋给指针数组的元素,第二种赋值方式直接将字符串常量的地址赋给指针数组的元素。
数字和字符串在内存中的存储方式是不同的。
对于数字,当我们定义一个整数变量时,它会占用一个固定大小的内存空间,取决于数据类型。例如,int 类型通常占用 4 个字节的内存空间。变量名代表该内存地址中存储的整数值。
int num = 10;
在内存中,变量 num 的值 10 被存储在分配给 num 的内存空间中。
对于字符串,字符串常量一般以字符数组的形式存储在内存中。每个字符占用一个字节的内存空间。C++ 中的字符串常量以 null 结尾(即以 \0 结尾),所以需要额外的一个字节来存储 null 终止符。
const char* str = "Hello";
在内存中,字符串 “Hello” 被存储为一个字符数组,每个字符占用一个字节的内存空间。变量 str 存储的是指向字符串第一个字符的指针,即字符串的起始地址。
无论是数字还是字符串,变量的名字本身并不直接存储在内存中,而是被编译器转换为相应的内存地址来进行访问。