㈠ c語言中指針和數組是怎樣相互轉換的
指針數組,就是一個數組里存放的都是指針,比如*p[8];p[0]里存放的就是一個指針數據
數組指針,數組名就是一個指向數組起始地址的指針,數組下標是縈引,比如num[0],他就相當於num+0;
num這個指針沒移動,於是取的是數組的第一個。num[1]相當於數組指針移1,於是指向數組第二個
㈡ C語言指針變數名和數組名在計算中是不是可以直接相互轉換啊
C++/C程序中,指針和數組在不少地方可以相互替換著用,讓人產生一種錯覺,以為兩者是等價的。
數組要麼在靜態存儲區被創建(如全局數組),要麼在棧上被創建。數組名對應著(而不是指向)一塊內存,其地址與容量在生命期內保持不變,只有數組的內容可以改變。
㈢ c語言指針轉換
沒有實用意義,只能用於練腦子,或考考雕蟲小技,或像魯迅筆下的孔乙己,賣弄一下「茴香豆的回字有多少種寫法」,以彰顯學問有多深。
*p 的「星號」是 「求值運算」,如果p是指針,*p 則是 指針 p 指向的值。
如果 p 不是指針, 那麼 這個 *p 就不知道是什麼東東,可能是乘法,也可能是錯的,那就閑著沒事練腦了。
(int *) 是「強制轉換」,有星號,則是「指針地址類型轉換」,例如 char *p="1"; (int *) p 就 把 p 的首地址變成 int 型 指針指向的地址,原來 p+1 是 p 的地址加1 ,現在 成了 p+sizeof(int)。 *(int *) p 就是首地址指向處4個位元組長度內存里的數值了。
*(int *)*p 不知道有何意義,要把程序寫全,才好猜,很費腦子的。簡單思維,可以說是一個錯誤表達式。
㈣ c# ref與c語言的指針能互傳嗎
嚴格來說不可以!
這里邊有幾個錯誤的理解需要糾正一下:
來格來說int是屬於.net的,int是Int32的別名,也就是32bits的數字,當然,short是Int16的別名,long是Int64的別名,如果說C#語言的話,可以說Int32,一般情況下我們再不區分int與Int32的區別。而C語言中的int卻並不是32bits數,而是16bit數!換句話來說,如果是平台調用(PInovke)的話,一般我們用C#中的short來接C語言中的int!
當然,如果指針類似值的話,一定要了解平台調用部分的數據封送!數據封送部分介紹了平台之間數據如果對接的,這部分的知識一定要理解。但是有時只有一個參數時,大多數我們會使用C#語言中自動轉換的方式,比如使用C#中int去接C語言中int中的值是沒有問題的(C#會把short自動轉換為int).
但是,對於結構(struct)之類的,由於其中包含多個值,所以對於對象進行平台封送時,一定要使用相應的形式(其實是內存數據的重新包裝而已),如果要使用特定的數據形式,一定要使用特性化編程中的位節說明來說明字體的長度(比如在接值的時候string接值時就必段說明內存段大小)。
第二個問題是關於ref或out的,ref只是傳址引用,並不是指針(一定一定不要用指針這個詞,因為在.net中除值類型valuetype和引用值類型object之外,在非安全編程unsafe下是存在指針的!)其實呢,無論是引用類型或是值類型的參數,傳入的都是一個值(值類型)或副本(淺表復制),而ref/out是傳址引用,在託管代碼下,ref/out表示的傳址引用,與指針還是有區別的!你可以認為他是一種隱藏的指針方式(*與&是配對的,這才是指針,傳入的是一個真實的邏輯地址),而ref/out並不是把指針進行了打包,而是將址進行了堆棧查找。換句話來說,指針傳入的是一個邏輯地址,而ref則告訴調用查詢你自己去這個變數的地址去改變——再說傳統一點(就是教學書上標準的說法)就是傳入的是對象並不是副本了(我們說正常的參數是一個對象的副本)!
第三個問題,也是關於ref/out的,一定要記著,如果第二個問題你理解了,第三個問題其實是不是犯錯的!關於參數簽名中含有ref/out的話,那麼調用時一定要使用ref來表現參數!比如set(ref int x)在調用時一定要使用set(ref x);而不能是set(x),否則只是傳入副本(值)所以,int x = 0; set(x);方法是錯誤的,應該是set(ref x);否則會出現無法配置簽名(找不到方法)的例外。
至於最後一個,那麼就是指針互傳這個稱呼是多麼錯誤的!關於非安全編程,是否存在指針互傳的問題也不是正確的。所以關於指針來說,兩種語言的指針都是各自所指,並沒有脫離語言本身的存在,所以這兩個指針互傳在語言層面之外,並不存在這樣的稱呼。
所以這里你如果將set(x)改為set(ref x)應該可以執行——如果不能執行,有執行錯誤(注意平台調用發生錯誤時,由於非託管的錯誤你只能拿到託管錯誤,並不能拿到真實的錯誤原因),將int改為short,然後就可以了!
㈤ 關於c語言的指針相互指向
指針變數也是變數,同樣存儲在內存中,它也有一個地址,取變數a的地址存在指針變數p中,所以&a和p的值肯定是相等的
取指針變數p的地址賦值給q,即q此時存儲著指針變數p的地址,而*q則是 指向 q中存放的地址 (指針變數p的地址),所以*q的值即是指針變數p中存放的地址,即是變數a的地址。
所以三個值相等。
㈥ c語言指針強制類型轉換
一個指針做算數加減的時候,字面上的加一或者減一,實際增加或者減少的值是其指向類型的空間大小
也就是說,p+1,實際增長的值是sizeof(*p)
所以,將p轉為int*後,加10,實際增加是10*sizeof(int)也就是40
而如果是p+2,由於p是char*,實際增加的是2*sizeof(char)=2
㈦ C語言中,指針的類型轉換
可以。
p = (int *)&a;
但是要注意的是,如果此時a==1.0f,*p就不一定是1。
因為這就相當於:
union{
inti;
floatf;
}u;
int*p=&u.i;
㈧ C語言的指針互換
是int類型,沒有錯啊,但是 它沒有空間啊? int t 系統會自動分配存儲一個int類型的空間,
而int *t t是一個指針?它指向哪裡了?將 *a 賦值給 *t ,這個t用什麼來存儲這個值?
㈨ C語言中指針的轉化
1的testpu是一個指針,並沒有給它分配內存,它指向的是系統的只讀的內存
2的testpu是一個數組,占內存空間3個位元組,是可讀寫的
最後的tepu1是這樣的,testpu本身是一個字元數組,可以理解成char*,先將char*強制轉換成int*,然後再取這個指針指向的內存值,因此得到testpu這個地址上4個位元組組成的int的值
㈩ c語言指針交換
這個是這樣的,因為指針變數一般就是32位的長度,同樣int類型也是32位的長度,p1裡面的地址也是能放在p裡面存儲的(char ,short類型就不行了)。但是對於編譯器來說,存放在p裡面,他就認為是一個整數,所以就不能做一些指針的操作了,比如*p。但是如果只是向你這種只是簡單交換一下值是沒問題的。