C++ — 指针和数组的关系?

在本文中,您将了解数组与指针之间的关系,并在程序中有效地使用它们。

指针是保存地址的变量。指针不仅可以存储单个变量的地址,还可以存储数组单元的地址。

看以下示例:

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

输出结果: 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值