通过指针索引分配一个值

时间:2019-09-16 04:37:59

标签: c gcc

我正在编写一个需要优化的程序。我有n个整数的指针,需要将它们保存在不同的数组中,但要共享内存。我的问题是:

是这个

int* ptr = (int*)malloc(sizeof(int)*10);
int** ptr2 = (int**)malloc(sizeof(int*)*10);
for (int i = 0; i < 10; ++i) {
    ptr[i] = i;
    ptr2[i] = &ptr[i];
}

相当于这个吗?

int* ptr = (int*)malloc(sizeof(int)*10);
int* ptr2 = (int*)malloc(sizeof(int)*10);
for (int i = 0; i < 10; ++i) {
    ptr[i] = i;
    ptr2[i] = ptr[i];
}

我的意思是,在第二种情况下,将*(ptr[i])的值复制到*(ptr2[i])ptr[i]中,而ptr2[i]指向相同的内存地址吗?

-编辑-

我问的原因是我有一个保存在uint8_t* data中的png图像,其中R,G和B像素是连续的,例如对于第一个像素(R, G, B) = (data[0], data[1], data[2]),第二个像素{ {1}},依此类推。因此,我需要通过将值存储在三个不同的数组中来分隔三个通道,出于显而易见的原因,我想共享(R, G, B) = (data[3], data[4], data[5])数组中使用的值和data中使用的值的内存, r_channelg_channel。因此,我不知道是否应该将每个通道声明为b_channeluint8_t*并分配其像素,如我作为示例发布的代码片段所示。

1 个答案:

答案 0 :(得分:0)

在下面的代码中,ptr是一个整数数组(动态创建),并存储从0到10的值,ptr2是一个整数指针数组,其中每个元素(int * )指向ptr的元素(int)。

int* ptr = (int*)malloc(sizeof(int)*10);
int** ptr2 = (int**)malloc(sizeof(int*)*10);
for (int i = 0; i < 10; ++i) {
    ptr[i] = i;
    ptr2[i] = &ptr[i];
}

以下代码在ptr2中创建ptr的副本。

int* ptr = (int*)malloc(sizeof(int)*10);
int** ptr2 = (int**)malloc(sizeof(int*)*10);
for (int i = 0; i < 10; ++i) {
    ptr[i] = i;
    ptr2[i] = &ptr[i];
}

因此,在示例2中,如果ptr中元素的值更改,它将不会反映在ptr中;而在示例1中,如果ptr中的元素值发生更改,它将自动反映在{{1中}},因为prt2中的元素直接指向ptr2元素。

如果您只想访问数据,则可以使用指针算术进行操作,例如 第n个像素ptr

但是,如果您打算将其存储在内存中,则创建副本似乎更合乎逻辑,因为它会占用更少的空间,因为R = data[3*n+0]; G = data[3*n+1]; B = data[3*n+2];