純實驗
在我們開始之前,這純粹是實驗性的,我不關心未定義的行為。
使用clang 13.
我的代碼
typedef struct {
char *chr;
int64_t len;
} string;
string str;
int main() {
str.chr = "ABCDE";
str.len = 6;
printf ("str.chr = %p\n", str.chr);
printf ("str = %c\n", *str);
}
輸出
str.chr = 0x5c0845c56e // same address
str = 0x5c0845c56e // same address
我想做類似的事情*str。這相當于*(0x5c0845c56e). 所以str基本上用作指向字串的指標。
Ofc,編譯器會拋出錯誤
error: indirection requires pointer operand ('string' invalid)
printf ("*str = %c\n", *str);
^~~~
我試過投射str到void *,char *但這不起作用。
uj5u.com熱心網友回復:
地址相同但型別不同。
*str表示結構的值,即它的所有內容。*(str.chr)表示由 . 指向的字符str.chr。
uj5u.com熱心網友回復:
我想做類似的事情
*str。這相當于*(0x5c0845c56e). 所以str基本上用作指向字串的指標。
但str不是指標。它是一個結構。要回答名義上的問題,不,C 中沒有辦法取消參考結構型別的值。
Ofc,編譯器會拋出錯誤
error: indirection requires pointer operand ('string' invalid) printf ("*str = %c\n", *str); ^~~~
正如我所說,您不能取消參考結構。
我試過投射
str到void *,char *但這不起作用。
當然不是。C 沒有定義結構和指標之間的任何轉換。
我想你一定是想用陣列來類比,但它們的行為根本不相似。但是,如果您想要結構的第一個成員,則可以使用&運算子獲取結構的地址,將其轉換為指向第一個成員型別的指標,然后取消參考以獲取表示第一個成員的左值:
printf ("str = %c\n", *(*(char **)&str));
// here ---------------------^^^^^^^^^^^^^^
但由于這取決于了解結構型別的定義(以使指標轉換正確),因此與以標準方式訪問第一個成員相比,它沒有任何優勢:
printf ("str = %c\n", *str.chr);
uj5u.com熱心網友回復:
str 未宣告為指標,因此您不能使用 * 取消參考它。
#include <stdio.h>
#include <stdint.h>
typedef struct {
char *chr;
int64_t len;
} string;
string str;
int main () {
int s = sizeof(char *);
str.chr = "ABCDE";
str.len = 6;
printf ("str.chr = %llu\n", &str.chr); //address of str.chr
printf ("char * = %llu\n", &str); //first 8 bytes of str structure
}
輸出
@home:~$ ./a.out
str.chr = 94437003264064
char * = 94437003264064
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/425189.html
