[英]Can't assign a pointer to primitive in C?
我想知道為什么這可以編譯:
#include <stdio.h>
int main(int argc, char const* argv[])
{
char *str[3];
char x = 'a';
char *px;
px = &x;
str[0] = px;
return 0;
}
雖然這不能:
#include <stdio.h>
int main(int argc, char const* argv[])
{
char *str[3];
str[1] = &'a';
return 0;
}
decla.c: In function ‘main’:
decla.c:9:14: error: lvalue required as unary ‘&’ operand
簡單地說,你只能取一個變量的地址; 像'a'
這樣的文字不是變量。
ISO / IEC 9899:2011§6.5.3.2地址和間接操作符
約束
¶1一元
&
運算符的操作數應該是函數指示符,[]
或一元*
運算符的結果,或者是一個左值,它指定一個不是位字段的對象,並且沒有用register
存儲器聲明 -類說明符。
標准的引用意味着您可以使用:
&array[i]
&*ptr
&function
或變量,或結構或聯合類型的成員:
&var
&ptr->member
&obj.member
等等。
有幾個回復說你只能獲取命名變量的地址,但這並不完全正確:如果你使用的是C99或更高版本,你也可以獲取復合文字的地址或復合文字的字段。 通常這對於例如調用一個帶有指向某個結構的指針的函數很有用,你只需要在調用期間創建它。 示例: draw(&(struct point){ 5, 10 });
可以通過一些途徑獲取標量的地址[使用解釋編輯]:
// create a char array containing only 'a', dereference to get 'a', and take its address
char *c = &*(char[]){'a'};
// same as above, but using an array subscript
char *c = & (char[]){'a'}[0];
/* create a literal for one unnamed struct containing only the char member "c",
access .c, and take its address all in the same statement */
char *c = &(struct{char c;}){'a'}.c;
並且在包含塊的持續時間內,* c將等於'a'。
然而,使用復合文字獲取文字地址的更簡單和更常見的方法只是聲明一個只有一個元素的數組文字,它將像往常一樣在賦值時衰減為指針:
char *c = (char[]){'a'};
這是相當典型的工作語法。 但事實證明,該語言允許我們做一些更直接和稍微不直觀的事情:我們可以聲明一個標量類型的復合文字。 這減少了上面的一切,更明顯:
char *c = &(char){'a'};
在你的情況下,
#include <stdio.h>
int main(int argc, char const* argv[])
{
char *str[3];
str[1] = &(char){'a'};
return 0;
}
它比'&'更冗長,實際上只比指定臨時變量少了幾個鍵,但確實如此。
問題是運算符的地址僅適用於名稱 。
char character = 'a';
str[1] = &character;
應該工作得很好。
&'a'
不起作用的原因是因為無法保證值甚至有地址。 它可以直接從代碼頁加載到寄存器中,在這種情況下,它不在可引用的內存中,或者至少不在您應該解除引用的內存中。
第一個片段工作正常,因為您正在獲取變量的地址。
在第二個代碼段中: -
str[1] = &'a';
這不是正確的方法。 'a'不是變量。 和運營商的地址運營商在名稱上工作。 如果你想要這個工作,那就改變它: -
char c = 'a';
str[1] = &c;
正如喬納森所說,你只能取一個變量的地址。 在封面下,'a'實際上只是一個短整數(ASCII值為'a')。 所以,它與為什么你不能這樣做是一樣的:
str[1] = &9;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.