㈠ 關於c語言的指針與虛擬地址,物理地址的關系問題
由於WINDOWS是一個實時多任務的操作系統,所以系統為每個進程(以32位進程為例)4G內存,所以每個進程看起來都擁有4GB的內存,但是該內存為
虛擬內存
空間,如果空間不夠還會使用硬碟進行虛擬。4G的內存,操作系統佔用2G,應用可以使用2G。所以c語言的指針一定是指向了虛擬的地址,而具體的
物理地址
由操作系統調度和調配。
㈡ 在C語言程序中如何區分傳遞參數是虛擬地址還是物理地址
只能通過取值范圍來判定。
一般情況下,如果是大於虛擬內存的地址,就是物理地址。
㈢ c語言printf("%d",&a)輸出的是虛擬地址還是物理地址
因為windows系統為每個WIN32程序都提供2G用戶內存,並且這2G內存從邏輯上都是0~2G獨立的內存,所以要使用虛擬內存,但是對於程序員你可以簡單地把它理解為物理地址
㈣ C語言中 知道邏輯地址 如果計算物理地址
要看具體情況的,這個是根據操作系統的地址映射有關的,操作系統根據可以把邏輯地址映射到不同的·物理地址的,要看具體的映射方法以及不同的操作系統,比如分段和分頁方式計算方法是不·一樣的。
「物理地址*10H + 偏移地址 和 物理地址*10H + 邏輯地址 是等價的嗎?」的說法應該是分段的說法。物理地址*10H + 偏移地址 和 物理地址*10H + 邏輯地址不是等價的:物理地址*10H + 偏移地址=邏輯地址
㈤ 用位運算對變數指定位置位(求C語言代碼)
置位的意思是置 1,我以變數位元組數最大為 4 位元組為例,你可以定義一個掩碼(你可以擴展這個掩碼至 64 位),再定義一個函數,實現指定的數與對應的掩碼進行位或運算即可。如:
#include<assert.h>
#include<stdio.h>
unsignedintdwMasks[]={
0x00000001,0x00000002,0x00000004,0x00000008,
0x00000010,0x00000020,0x00000040,0x00000080,
0x00000100,0x00000200,0x00000400,0x00000800,
0x00001000,0x00002000,0x00004000,0x00008000,
0x00010000,0x00020000,0x00040000,0x00080000,
0x00100000,0x00200000,0x00400000,0x00800000,
0x01000000,0x02000000,0x04000000,0x08000000,
0x10000000,0x20000000,0x40000000,0x80000000,
};
unsignedintset_bit(unsignedintvalue,intnIndex)
{
assert(nIndex>=0&&nIndex<32);
returnvalue|dwMasks[nIndex];
}
intmain()
{
printf("set_bit(100,0)=%u ",set_bit(100,0));
printf("set_bit(100,1)=%u ",set_bit(100,1));
printf("set_bit(100,2)=%u ",set_bit(100,2));
printf("set_bit(100,3)=%u ",set_bit(100,3));
printf("set_bit(100,4)=%u ",set_bit(100,4));
printf("set_bit(100,5)=%u ",set_bit(100,5));
return0;
}
Linux 下編譯及測試結果如下:
[root@iZ25a38chb4Ztest]#g++test.cpp-g3-Wall-otest
[root@iZ25a38chb4Ztest]#./test
set_bit(100,0)=101
set_bit(100,1)=102
set_bit(100,2)=100
set_bit(100,3)=108
set_bit(100,4)=116
set_bit(100,5)=100
100 的二進製表示為:1100100, 第 2 位和第 5 位本來就為 1,所以置 1 後結果仍然為原來的數。
以上這種方法叫查表法,通常應用於實際項目開發中,效率非常之高。
㈥ C語言中知道邏輯地址如果計算物理地址
可以這么考慮!先把邏輯地址(H)轉換成二進制,前6位為頁號p得先轉換成10進制為2,取得對應的塊號,用塊號*1024加上後10位為物理地址。 物理地址轉化十進制就是再除以1024等於數A余數B,A為邏輯塊號
㈦ c語言指針關於虛擬地址的問題
因為你是64位系統..
磁碟的文件區域被映射到32位虛擬內存後..
在文件區域進行指針加1..經過映射關系..在32位虛擬地址就是加4
而通過MMU將虛擬內存換頁進入物理內存後..由於你是64位機..所以你的物理地址是加8
因為虛擬地址和Cache是透明的..所以你可以間接查看它們..從而驗證這個關系..
至於要驗證物理地址和磁碟區域的關系..
可能就比較難了..直接針對特定內核寫一個內核解析器就行了..
㈧ C語言關於取值和取址
1、首先打開Visual C++,點擊左上角「文件」菜單按鈕,並點擊「新建」按鈕。在彈出的窗口中首先選擇「文件」選項卡,在左側列表中選取「C++ Source File」項。
㈨ c語言中如何把pcie物理地址映射到虛擬地址,在bc環境下而不是在linux下c編程環境
沒有什麼進入C語言編程的。
先用編輯器(vim,Emacs)寫好源代碼,再gcc編譯。
如,你要寫一個hello程序,
vim hello.c 進入編輯環境
gcc hello.c -o hello 寫好源代碼gcc編譯(相關的詳細應用,google一下)
前提要會用vim和安裝好gcc編譯環境。
運行程序就是,在文件所在的目錄下指令./hello
㈩ C語言的&運算符取的是邏輯地址還是物理地址 每次重新編譯運行後 輸出變數的地址值都一樣 怎麼理解
你自定義的變數A,在你編譯的時候就已經確定了,所以是一個相對地址。
程序執行時,系統會分配一片內存空間供程序使用,當如果你定義的變數A不是相對地址的話,那麼每次分配內存是都要再次申請內存空間,顯然是不合理的。
所以變數A是相對地址,你程序內存空間起始地址為0,A的地址就是相對於起始地址,這一定程度上也算是一種邏輯上的地址吧...但是和操作系統的邏輯地址不一樣