指標和陣列的關係
參考朱有鵬c語言大講堂
1、指標和陣列的型別匹配的問題:
int *p;
int a[5];
p = a; //型別的匹配的問題
p = &a; //&a和a的數值是一樣的,但是&a時表示整個陣列的大小的
位址的列印是一樣的。
&a/a/&a[0],從數值上看是完全一樣的,從意義上面看,
a和&a是整個陣列的首位址,從型別來看,a和&a[0]元素的指標是int*型別的,
而&a是陣列的指標int (*)[5]型別。
2、指標參與運算的時候,因為指標變數本身儲存的數值是表示位址的,
所以運算也是位址的運算。指標變數加1,並不是真正的加一,是加上前面型別的大小的。
1*sizeof(指標型別);
指標和強制型別的轉換
1、變數的資料型別的再一次的深入的理解
1.1、寫乙個例項
(1)所有的型別的資料儲存在記憶體中,都是按照二進位制的格式,但是具體怎麼解析是看編譯器來的。
編譯器就會把int 型別的解析方式,和float型別的儲存方式是不一樣的。
int 型別的儲存方式就是按照二進位制的儲存方式來的,但是float的儲存方式
(2)int 、char 、short等都屬於整型的型別,他們的儲存方式(數轉換成二進位制往記憶體中放的方式是相同的,
只是記憶體格仔大小是不同的(所以這幾種整型就彼此叫做二進位制的相容格式)),而float和double的儲存方式
彼此不同,和整型是不同的,在裡面放的儲存方式也是不同的。
(3)int a=5 時,編譯器給a分配4位元組的空間,並且將5按照int型別的儲存方式轉成二進位制a所對應的記憶體
空間中去,(a是用來做左值的)我們printf去列印a的時候(a此時是做為右值的),printf內部的vsprintf函式會按照格式化字串
所代表的型別去解析出的值輸出。
(4)
存進去時是按照這個變數本身的資料型別來儲存的(比如本例子中a為int所以按照int格式來儲存的),但是取出來的是按照printf中%d之類的格式化字串的格式來提取的。此時雖然a所代表的記憶體空間中的10101序列並沒有變(記憶體是沒有被修改的)但是怎麼理解(怎麼把這些1010轉換成數字就不一定了)。比如我們用%d來解析,那麼還是按照int格式解析
總結:c語言中的資料型別的本質,就是決定了這個數在記憶體中怎麼儲存的問題,也就是決定了這個數如何轉成二進位制的問題。
一定要記住的一點是記憶體只是儲存1010的序列,而不是管這些1010怎麼解析。
在記憶體裡面也是沒有邊界的。所以要求我們平時資料型別不能瞎胡。
3、指標資料型別的含義
(1) 指標的資料型別的含義:指標的本質是:變數,指標就是指標變數
(2) 乙個指標涉及2個變數,乙個是指標變數的自己本身,乙個是指標變數指向的那個變數
(3) int *p:定義指標變數型別,p(指標變數本身)是int *型別
*p(指標指向的那個變數)是int型別的。
(4) int *型別就是指標型別,只要是指標型別都是占用4個位元組,解析方式都是按照位址的方式來解析的(意思是裡面存的32個二進位制加起來表示乙個記憶體位址),結論就是:所有的指標型別(不管是int* 還是char*還是double*)
的解析方式都是相同的。
(5) 對於指標所指向的那個變數哪說,指標的型別就很重要了,指標所指向的那個變數的型別(它所對應的記憶體空間的解析方法)要取決於指標的型別,比如指標是int * ,那麼指標指向的變數是int型別的。
指標和陣列的關係
陣列名是乙個指標常量,表示陣列第乙個元素的的起始位址。如 int a 5 a表示陣列第乙個元素a 0 的起始位址 a 0 一 引用陣列元素的方法 用陣列下標引用陣列元素 陣列a中元素用下標表示為 a 0 a 1 a 2 a 3 a 4 用指標引用陣列元素 陣列a中元素用下標表示為 int p a p...
指標和陣列的關係
include include int a 20 int sum int pa,int n,int p return ans int main 陣列引用 include include intmain for i 0 i 5 i printf d a i printf n return0 指標引用 ...
指標和陣列的關係
指標與陣列的天生姻緣 以指標方式來訪問陣列元素 1 陣列元素使用時不能整體訪問,只能單個訪問。訪問方式有2種 陣列形式和指標形式。2 陣列格式訪問陣列元素是,陣列名 下標 注意下標從0開始 3 指標格式訪問陣列元素是 指標 偏移量 如果指標是陣列首元素位址 a或者 a 0 那麼偏移量就是下標 指標也...