在本文中,您将了解数组与指针之间的关系,并在程序中有效地使用它们。
指针是保存地址的变量。指针不仅可以存储单个变量的地址,还可以存储数组单元的地址。
看以下示例:
int* ptr; // 定义指针变量ptr
int a[5];
ptr = &a[2]; // &a[2]是a[5]这个数组的第三个元素的地址。
假设指针需要指向数组的第四个元素,即在上述情况下的第四个数组元素的保存地址。由于ptr指向上面示例中的第三个元素,ptr + 1将指向第四个元素。您可能会认为,ptr +1为您提供了ptr的下一个字节的地址。 但这是不正确的。这是因为指针ptr是指向int的指针,并且int的大小对于操作系统是固定的(64位操作系统中int类型大小是4字节)。 因此,ptr和ptr +1之间的地址相差4个字节。如果指针ptr是指向char的指针,那么ptr和ptr + 1之间的地址将相差1个字节,因为一个字符的大小是1个字节。
示例1:C ++指针和数组
C ++程序使用数组和指针显示数组元素的地址
#include <iostream>
int main() {
float arr[5]; // 定义浮点型数组
float* ptr; // 定义一个浮点型指针变量ptr
std::cout << "使用数组显示地址:" << std::endl;
for (int i = 0; i < 5; i++) {
std::cout << "&arr[" << i << "]=" << &arr[i] << std::endl;
}
ptr = arr; // 将arr数组的首地址赋给指针变量ptr
std::cout << "\n使用指针显示地址" << std::endl;
for (int i = 0; i < 5; i++) {
std::cout << "ptr+" << i << "=" << ptr + i << std::endl;
}
return 0;
}
输出结果为: (结果不唯一)
在上面的程序中,使用不同的指针ptr来显示数组元素arr的地址。但是,数组元素可以通过使用相同的数组名arr来使用指针表示法来访问。例如:
int arr[3]; &arr[0] 等同于 arr &arr[1] 等同于 arr + 1 &arr[2] 等同于 arr + 2
代码如下:
#include <iostream>
int main() {
int arr[3];
std::cout << "&arr[0]的值为:"<< &arr[0] << std::endl;
std::cout << "arr的值为:" << arr << std::endl;
std::cout << "&arr[1]的值为:" << &arr[1] << std::endl;
std::cout << "arr+1的值为:" << arr +1 << std::endl;
return 0;
}
运行上述程序,得到结果如下(结果不唯一,这是因为每次运行时给数组分配的地址不一样):
示例2:指针和数组
C ++程序使用指针符号显示数组元素的地址。
#include <iostream>
using namespace std;
int main() {
float arr[5];
cout<<"使用指针符号显示地址: "<< endl;
for (int i = 0; i < 5; ++i) {
cout << arr + i <<endl;
}
return 0;
}
输出结果:(结果不唯一)
您知道,指针ptr保存地址,而表达式*ptr给出存储在地址中的值。类似地,可以使用*(ptr + 1)获取存储在指针ptr + 1中的值。
请考虑以下代码:
int ptr[5] = {3, 4, 5, 5, 3};
-
&ptr[0]等于ptr,*ptr等于ptr[0]
-
&ptr[1]等于ptr + 1,*(ptr + 1) 等于ptr[1]
-
&ptr[2]等于ptr + 2,*(ptr + 2)等于ptr[2]
-
&ptr[i]等于ptr + i ,*(ptr + i)等于ptr[i]
验证代码如下:
#include <iostream>
int main() {
int arr[5] = { 1,3,9,8,5 };
int* ptr; // 定义一个int类型的指针变量ptr
ptr = arr;
std::cout << "arr[0]=" << arr[0] << std::endl;
std::cout << "*ptr=" << *ptr << std::endl;
std::cout << "arr[1]=" << arr[1] << std::endl;
std::cout << "*(ptr+1)=" << *(ptr + 2) << std::endl;
std::cout << "arr[2]=" << arr[2] << std::endl;
std::cout << "*(ptr+2)=" << *(ptr + 2) << std::endl;
return 0;
}
输出结果:
注意:*ptr+1 与 *(ptr+1) 是有区别的,区别如下:(假设ptr指向arr数组的地址)
*ptr+1 :ptr存放的内容是arr数组的地址,即arr数组中第一个元素的地址,*ptr存放的内容是arr数组中第一个元素的值,则*ptr+1表示在第一个元素的值的基础上加1。
*(ptr+1):同样,ptr存放的内容是arr数组的地址,即arr数组中第一个元素的地址,ptr+1存放的内容是arr数组中第二个元素的地址,则*(ptr+1)存放的是第二个元素的值。
验证代码如下:
#include <iostream>
int main() {
int arr[5] = { 1,3,9,8,5 };
int* ptr; // 定义一个int类型的指针变量ptr
ptr = arr;
std::cout << "arr[1]=" << arr[1] << std::endl;
std::cout << "*(ptr+1)=" << *(ptr + 1) << std::endl;
std::cout << "*ptr+1=" << *ptr + 1 << std::endl;
return 0;
}
输出结果:
上述代码中, arr数组为一个可以存放5个int类型数据的一维数组,且5个元素分别为:1,3,9,8,5。
我们定义了一个int类型的指针变量ptr,并且将arr数组的地址,即第一个元素的地址赋给ptr,则有*(ptr+1)存放的是arr数组中第二个元素3,而*ptr存放的是arr数组中第一个元素1,那么*ptr+1就为2。
示例3:C ++指针和数组
C ++程序,用于插入和显示使用指针符号输入的数据。
#include <iostream>
using namespace std;
int main() {
float arr[5];
// 使用指针符号插入数据
cout << "输入5个数字: ";
for (int i = 0; i < 5; i++) {
cin >> *(arr + i);
}
// 使用指针符号显示数据
cout << "显示数据: " << endl;
for (int i = 0; i < 5; i++) {
cout << *(arr + i) << endl;
}
return 0;
}
输出结果: