由61C P1开始的指针笔记

First Post:

Last Update:

dereferencing a pointer in c写61C P1的时候写出来这么一段代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
typedef struct Color 
{
uint8_t R;
uint8_t G;
uint8_t B;
} Color;
typedef struct Image
{
Color **image;
uint32_t rows;
uint32_t cols;
} Image;

int count = image->cols*image->rows;
image->image = (Color**)malloc(sizeof(Color*) * count);

Color *evaluateOneCell(Image *image, int row, int col, uint32_t rule){
// YOUR CODE HERE
for(int i = 0; i < 6; i++){
Color *pp =*(image->image+i);
printf("%3hhu %3hhu %3hhu",pp->R,pp->G,pp->B);
}
}

我的问题在于不能理解

1
Color *pp =*(image->image+i);

这段代码表达的是什么?

我的基础很差,很多代码细节都是仰仗PKU大佬来进行“学术不端”。但是之后还要继续挑战S081和ysyx,所以我必须要弄懂这些。

以下内容多数来自C Pointers

首先我们知道,数组在内存中是连续存储的,而指针归根到底是指向地址的变量。

指针的使用

一个简单的例子

1
2
3
int var = 10;
int * ptr;
ptr = &var;

指针解引用

dereferencing a pointer in c

指针解引用是访问

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
re pointer variable
int* ptr;

// note that data type of ptr and var must be same
ptr = &var;

// assign the address of a variable to a pointer
printf("Value at ptr = %p \n", ptr);
printf("Value at var = %d \n", var);
printf("Value at *ptr = %d \n", *ptr);
}

// Driver program
int main()
{
geeks();
return 0;
}

输出

1
2
3
Value at ptr = 0x7ffca84068dc 
Value at var = 10
Value at *ptr = 10

双指针

在C语言中,我们可以创建指向指针的指针,以下是对原文的翻译。

1
2
*pointer_name; // get the address stored in the inner level pointer获取内部指针储存的地址
**pointer_name; // get the value pointed by inner level pointer获取内部指针地址

Note: In C, we can create multi-level pointers with any number of levels such as – ***ptr3, ****ptr4, ******ptr5 and so on.

最后写一下开头问题的答案吧

这行代码Color *p =*(image->image + (newrow * image->cols + newcol));尝试做的是:

  1. 计算newrow * image->cols + newcol,这给出了从图像开始到指定行和列的偏移量(假设图像数据是连续的,并且按行优先顺序排列)。

  2. image->image + ...image->image指针向前移动这个偏移量的位置。

  3. 然后,*(...)试图解引用这个新的指针位置,但由于image->image很可能是一个指向Color类型(或类似类型,表示颜色的结构体)的指针,这里的解引用并不直接指向Color类型的值,而是指向了包含Color类型值的数组的一个Color元素。因此,理论上,直接解引用后赋值给Color*类型的指针p是合理的,但写法上有些绕。

以上摘抄自文心一言,我个人的理解是*(...) 的括号里实际上是指向了一长串指针数组里的第一个数组索引的地址,因此当我们解引用时,我们实际得到了数组索引指向的地址,也就是元素本身的地址,最后再用Color*储存起来。

以上就是这篇博文的大概内容了,我想再多写一些,可惜现在太晚了熬不住了,知识储备也不够,希望能在学习一些ysyx之后再来补充吧!

其实有点伤心的,作为一个学习者,我追求的并不只是勉强看懂,而是能在需要的时候信手拈来。然而这么久我却依然没法好好的写完一个正式的project,感受coding的魅力。