我正在编写一个需要优化的程序。我有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_channel
和g_channel
。因此,我不知道是否应该将每个通道声明为b_channel
或uint8_t*
并分配其像素,如我作为示例发布的代码片段所示。
答案 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];