c語言define以及取位址的問題

時間 2022-07-22 14:05:44

1樓:

#define是字串替換,#define fix_long(x) (*(unsigned *)&(x)= swap_4(*(unsigned *)&(x)))就是在**中寫fix_long(x)就等於寫了(*(unsigned *)&(x)= swap_4(*(unsigned *)&(x)))。這個表示式的意思是將值x的位址強制為unsigned int*型指標再取其內容作為函式swap_4的實參,經函式swap_4操作後將其返回值賦給經位址強制轉換後的變數x。第二個問題就是經#definefix_float(x) fix_long(x)後,**中寫中寫fix_float(x)和寫fix_long(x)效果是一樣的,也就是寫fix_float(x)的意思也是(*(unsigned *)&(x)= swap_4(*(unsigned *)&(x)))了。

供參考……

2樓:匿名使用者

1,fix_long(x) 把4位元組的數交換位元組順序,可能有的系統有不同的要求。

例如: x=0x10203040 (16進製制,很容易看出來)fix_long(x); 執行後,x==0x40302010;

2,就是你說的

c語言#define問題

3樓:匿名使用者

#include

#define da 9

#define db (da)*10

//巨集尾不需要加分號

int main()

c語言中 取內容與取位址運算子的問題

4樓:匿名使用者

我明白你什麼意思,指標的概念確實不好理解!

1,先給你說下指標,你把指標理解了運算子的抵消就明白一半了!

指標裡面是儲存的記憶體位址(就像int變數裡面儲存的是整型變數乙個意思)。

整型變數儲存在記憶體裡面,我可以通過這個變數名稱來呼叫這個資料,也可以通過指標裡面這個變數的位址加上*(間接訪問運算子),來呼叫這個資料。

2,再說下運算子*和&

*是間接訪問運算子:就是可以通過位址,找到這個位址裡面的變數,所以 *p1 就等同於變數a

&是求位址運算子:就是將變數所在的記憶體位址,提取出來

這兩個運算子的運算等級是相同的,也就是說誰距離變數近,就誰先。所以*&a和*(&a)是一樣的,都是先取位址,在對位址進行間接訪問。但是一定要注意*與&的順序,&*a是無效的。

3,再說下題

*運算子就是對位址進行操作的,那麼 *位址 的意思就是訪問位址裡面的資料,而&a就是取變數a的位址,所以*&a: 先取變數a的位址 再 對位址進行間接訪問,兩個操作就相互抵消了,最後還是變數a。

4,還有什麼不明白的麼?

5樓:小山山

* 的優先順序大於&,所以取值必須在& a加括號,不然會無意義

6樓:匿名使用者

詳細點兒,看不懂你什麼意思...

把規範的寫出來...

如果是這樣,這個賦值確實沒什麼意義...

c語言關於取位址符的問題。

7樓:豬頭或火寶寶

你好!!

1.位址就像你家的位址一樣,指標變數存放的就是你家的位址,要想到你家,必須找到存放你家位址的變數(針對指標而言),那就是指標。

2.要是變數是整型不是字串陣列名,那就的帶取位址符!!!

3.& 是取位址符的,(但還有位於運算),要是需要變數的位址就要加取位址符。

不理解,我們在交流!!!

8樓:

1通俗說的 c語言的位址 就是你家街道的門牌號 送信的不會通過你的名字找到你 而是門牌號

2.必須要用 不可以去掉 它就是郵遞員

3.情況很多 慢慢體會

9樓:匿名使用者

位址就是指記憶體中存放資料的位址,就像你家的門牌號一樣。

scanf("",位址列表)這個函式要求的第二個引數就是需要乙個位址,如果你是字元陣列名,就可以不用&,因為陣列名就是位址。

&後面必須跟變數名。

c語言#define問題

10樓:匿名使用者

巨集替換,定義乙個m巨集,這個巨集有乙個引數n,預編譯時會把你的巨集替換成你定義的運算,引數會用你提供的引數,如x=2*(n+m(2));替換後就是,x=x*(3+(3+1)*2);

11樓:匿名使用者

巨集分為有引數的和不帶引數的巨集。

#define n 3是不帶引數的巨集

#define m(n) (n+1)*n是帶引數的巨集,待引數的巨集和函式的功能有點類似,但是它不是函式,在編譯之前已經被替換為對應的實際**。

12樓:匿名使用者

#define 這個是巨集定義,比如#define n 3,它的意思就是給3起了乙個外號,外號就叫n,

#define m(n) (n+1)*n 這個的意思就是(n+1)*n的外號就是m(n),這裡面n是需要你賦值的。

巨集定義就可以看做n=3,m(n)=(n+1)*n

13樓:匿名使用者

巨集定義的時候,編譯器是直接把變數替換成引數

m(2) = (n+1)*2

14樓:戶順閃代桃

ctrl+z

組合鍵就是

eof.

c系統裡定義了

eof--

(end

offile)

見#define

eof(-1)

所以加不加

巨集定義語句:

#define

eof-1

是一樣的。

當讀到檔案結束時,許多輸入函式

都會送返

eof也就是return

-1.鍵盤輸入

用:while

(scanf("...",...)

!=eof);

或if(scanf("...",...)

==eof

)goto

lab_finish;

控制都可以。

scanf("...",...)

括號裡讀什麼都可以,%d

%f..都可以,一旦

ctrl+z,

就會得到

eof。是

scanf()函式的返回值,不是括號裡的引數返回值。

c語言 define值的問題

15樓:匿名使用者

#define s 3;

會導致編譯時將所有的s全替換成「3;」了

巨集定義時,不要帶;結尾

去掉分號,改成:

#define s 3

也可以這樣改一下:

const int s=3;

16樓:

你把#define後面的分號刪掉就可以通過了

寫成#define s 3

在c或c++語言源程式中允許用乙個識別符號來表示乙個字串,稱為「巨集」。被定義為「巨集」的識別符號稱為「巨集名」。在編譯預處理時,對程式中所有出現的「巨集名」,都用巨集定義中的字串去代換,這稱為「巨集代換」或「巨集」。

巨集定義是由源程式中的巨集定義命令完成的。巨集代換是由預處理程式自動完成的。

17樓:

#define s 3;

改成#define s 3

也就是去掉3後面的分號

#define epxl 1e-12;

一樣因為在此處#define只作簡單的字元替換#define s 3;

將後面出現s的地方換成3; 所以會出錯

c語言乙個巨集#define的問題

18樓:

1、如上回答,巨集定義是替換void vfunction( void *pvparameters ) __attribute__((noreturn))

2、__attribute__關鍵字主要是用來在函式或資料宣告中設定其屬性。給函式賦給屬性的主要目的 在於讓編譯器進行優化。

3、函式宣告中的__attribute__((noreturn)),就是告訴編譯器這個函式不會返回給呼叫者,以便編譯器在優化時去掉不必要的函式返回**。

19樓:匿名使用者

巨集定義,是等價替換的意思,這樣等價代替可以省去很多字元。

20樓:黃石佳誠家電維修

__attribute__((noreturn))

應該是位址吧

21樓:恕本如心

用porttask_function_proto( vfunction, pvparameters )

代替void vfunction( void *pvparameters ) __attribute__((noreturn))

C語言 陣列的值是位址

說的有點亂呢 陣列指標 他是乙個指標,指向乙個陣列 指標陣列 他是乙個陣列,陣列存放的元素是指標 不對,陣列的位址等於首元素的位址 陣列有值,其為首元素的位址 是不對的。陣列是一組有序資料的集合,陣列中的每乙個資料都屬於同乙個資料型別,並且按順序存放在乙個連續的儲存空間中,即最低的位址存放第乙個元素...

為什麼C語言這麼火就C語言的歷史以及今天的用途

其實c語言用的並不多,並且我們學都是已經過時了的東西,但是c語言上的程式設計思想值得我們去學習,只要看得懂c語言,別的程式語言自學都不是問題,c語言是基礎,沒有這個基礎,什麼程式設計都變得相當難理解,更別說自學了,所以c語言才這麼火 就如英語一樣,很多個它都可以通用的。c語言有很多庫函式,是結構語言...

請教c語言關於位址的輸出問題,請教C語言關於位址的輸出問題

孤狼騰龍 第乙個 printf p a 這是輸出a的值 printf p a 這是主輸出存放a值的位址 第二個 如果填b輸出的是a的位址 要輸出指標變數b的位址就直接printf p b 第三個 scanf d a 這是賦值語句,就是將輸入的數字存放在位址a中 記住有 符號,表示位址 牧蕙蘭 第乙個...

c語言把結構體陣列的位址賦給指標

1 結構體指標其實是乙個指標,它儲存的是指向某個結構體的 位址 所以結構體指標陣列儲存的其實是指向一組結構體的 位址 陣列,它本身並不包含結構體的具體內容 沒有被分配記憶體 2 所以當用到他們時,要麼重定向,比如 d b 讓d指向b,d儲存的是b的位址,這樣就能通過d來呼叫b了 要麼用malloc為...

關於c語言中給絕對位址的賦值問題

你這個表示式 unsigned int 0x100000 0x3322是錯誤的,不存在這種寫法 這個符號,只能對變數使用,還有等號左邊,型別轉換是非法的 你的想法是對的。不知道你在哪看的資料,資料上的不對,左值為常量,不能賦值。你說的很對,完全正確。看來你對基礎概念理解的很透。型別轉換的結果不是左值...