這個問題在這里已經有了答案: 在 C/C 中宣告指標變數的正確方法 [關閉] (5 個回答) 18 小時前關閉。
我以為#1
uint8_t* start_ptr, end_ptr;
和#2
uint8_t* start_ptr;
uint8_t* end_ptr;
一般是一樣的。在我看來他們不是。有人可以指定第一個除了第二個之外做什么嗎?
發生了什么:
if(strncmp(mseq,mseq_a,8) == 0){
start_ptr = MY_UART_RingBuffer_getReadPointer();
start_found = 1;
}
if(strncmp(mseq 3,mseq_z,5) == 0){
end_ptr = MY_UART_RingBuffer_getReadPointer();
if (start_found == 1){
if(!MY_UART_RingBuffer_getOverlap()){
end_ptr = end_ptr - 6;
}
else{
start_found = 0;
continue;
}
ptrdiff_t length = end_ptr - start_ptr;
start_found = 0;
}
}
在使用 #1 時,編譯器會給我這個用??于長度計算:
../Core/Src/main.c:143:32: error: invalid operands to binary - (have 'int' and 'uint8_t * {aka unsigned char *}')
ptrdiff_t length = end_ptr - start_ptr;
使用#2 一切正常。
我不知何故在這里感到困惑。我看到了解決方案,但我并沒有真正理解這個問題。
非常感謝 ;-)
uj5u.com熱心網友回復:
從語法上講,該型別uint8_t是一個宣告說明符;而指標*是宣告符。據到C的語法 宣告符系結到該宣告的名稱,而不是宣告說明符。因此,您的第一行被決議為:
uint8_t (*start_ptr), end_ptr;
即只有名字成為一個指標。
這是一些人傾向于將空格放在指標之前*而不是之后的原因之一。在一行中宣告這些的正確方法是:
uint8_t *start_ptr, *end_ptr; // both are pointers to uint8_t.
uj5u.com熱心網友回復:
在C宣告包括兩個主要部件-的序列宣告說明符之后是逗號分隔的串列說明符。指標、陣列和函式被指定為宣告符的一部分,因此您的宣告被解釋為
uint8_t (*start_ptr), end_ptr;
并且僅start_ptr宣告為指標。
這個想法是宣告符的結構與代碼中運算式的結構相匹配。當您想訪問uint8_t指向的值時start_ptr,您可以使用一元運算*符取消參考它:
x = *start_ptr;
運算式 的型別*start_ptr是uint8_t,所以宣告寫成
uint8_t *start_ptr;
除了區分相同型別的標記外,空格沒有意義。由于*不能是任何識別符號的一部分,因此您可以將該宣告撰寫為
uint8_t *start_ptr;
uint8_t* start_ptr;
uint8_t*start_ptr;
uint8_t * start_ptr ;
但它總是被標記為uint8_t, *, start_ptr, ;, 并被決議為
uint8_t (*start_ptr);
所以如果你想同時宣告start_ptr和end_ptr作為指標,那么你需要寫
uint8_t *start_ptr, *end_ptr;
或者
uint8_t *start_ptr;
uint8_t *end_ptr;
換句話說,我們將指標宣告為
T *p, *q;
出于完全相同的原因,我們不將陣列宣告為
T[N] a, b;
因為后綴[]下標運算子的運算元是aand b, not T,而一元(提示提示)*運算子的運算元是pand q, not T。
uj5u.com熱心網友回復:
本宣告
uint8_t* start_ptr, end_ptr;
可以等效地重寫為
uint8_t ( * start_ptr ), ( end_ptr );
所以宣告的指標start_ptr型別uint8_t *和變數end_ptr的型別uint8_t。
如果你想宣告兩個指標,你必須寫
uint8_t *start_ptr, *end_ptr;
另一種方法是使用 typedef 宣告引入一個新的型別說明符,例如
typedef uint8_t * uint8_t_ptr;
使用宣告的 typedef 名稱,您可以撰寫
uint8_t_ptr start_ptr, end_ptr;
在這種情況下,兩個宣告的變數都將具有指標型別uint8_t *。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/379862.html
上一篇:字串標記化在讀取整個字串之前終止
