gpt4 book ai didi

c++ - 直接从指针/地址访问数组的元素

转载 作者:太空宇宙 更新时间:2023-11-04 16:00:53 25 4
gpt4 key购买 nike

我愿意:

  • 将指向整数数组的指针传递给方法,
  • 使用方法中的值,
  • 在方法中调整数组的大小,
  • 然后在方法外继续使用数组。

我的方法声明有 func(int** arr_address),我调用方法就像 func(&arr)。一种可行的方法是在我的方法中分配局部变量,但这看起来很笨拙。我尝试使用的方法是直接访问数组元素,如 *arr_address[1],但这似乎将 [1] 偏移量应用于指针的内存地址,而不是数组数据开始的地址在内存中。

这是一个简单的程序,其输出说明了两种不同的方法:

#include <iostream>
#include <stdlib.h>

void func(int** arr1_address, int** arr2_address)
{
int* arr1_local = *arr1_address;

arr1_local[1]=2; // Works
*arr2_address[1]=22; // (*) Writes to position 0 of wrong array!

// These realloc() calls were incorrect in the original question
//arr1_address = (int**)realloc(*arr1_address, 3*sizeof(int));
//arr2_address = (int**)realloc(*arr2_address, 3*sizeof(int));
*arr1_address = realloc(*arr1_address, 3*sizeof(int));
*arr2_address = realloc(*arr2_address, 3*sizeof(int));

//arr1_local[2] = 3;
//*arr2_address[2] = 33;
}

int main()
{
int* arr1;
int* arr2;

arr1 = (int*)calloc( 2, sizeof(int) );
arr2 = (int*)calloc( 2, sizeof(int) );

arr1[0] = 1;
arr2[0] = 11;

std::cout << "arr1, before func(): " << &arr1 << std::endl;
std::cout << "arr2, before func(): " << &arr2 << std::endl;

func(&arr1, &arr2);

std::cout << "arr1, after func(): " << &arr1 << std::endl;
std::cout << "arr2, after func(): " << &arr2 << std::endl;

std::cout << "" << std::endl;

std::cout << "arr1: " << std::endl;
std::cout << arr1[0] << std::endl;
std::cout << arr1[1] << std::endl;
std::cout << arr1[2] << std::endl;

std::cout << "" << std::endl;

std::cout << "arr2:" << std::endl;
std::cout << arr2[0] << std::endl;
std::cout << arr2[1] << std::endl;
std::cout << arr2[2] << std::endl;

return 0;
}

输出如下:

arr1, before func(): 0xffffcc08 // Note offset after arr2 location in memory
arr2, before func(): 0xffffcc00
arr1, after func(): 0xffffcc08 // realloc did not move the arrays
arr2, after func(): 0xffffcc00

arr1:
22 // Note line marked (*) wrote here instead of arr2[1]
2
66594

arr2:
11
0
66554

我很确定我理解为什么标记 (*) 的行会这样工作。我想知道是否有类似的方法直接从其地址寻址 arr2 的 [1] 元素。

(如果之前有人问过这个问题,我深表歉意,我已经阅读了很多答案,并在提问之前尽了最大努力进行调查。)

编辑:更好的标题,修复 realloc() 行中的错误

最佳答案

I would like to know if there is a similar method of addressing the [1] element of arr2 directly from its address.

[] 应用于 arr2_address 时,您看到该行为的原因是 [] 的优先级高于 * 。您可以通过应用括号强制您想要的优先级:

(*arr2_address)[1] = 22;

关于c++ - 直接从指针/地址访问数组的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44697498/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com