在建立變數時 *號和變數名結合,不和型別名結合
編譯器在編譯時,是從右到左識別的,哪怕在定義時
(
int*
)p,s;
這樣寫也是錯誤的,這樣的寫法編譯器會識別為強轉功能,但是p和s並沒有初始化,自然也就無法進行強轉
強轉的寫法是:
int a=
0x12345678
;int
*ip=
&a;char
*cp=
(char*)
&a;char
*p=(
char*)
&a;*p=
'a';
p=p+1;
*p='b'
;p=p+1;
*p='c'
;p=p+1;
*p='d'
;p=p+
1;
要明白上面的程式首先我們要明白小段存放的原理
小段存放
通過這個程式我們可以知道不同型別轉換時,替換值的過程,建議通過編譯除錯來看看
這裡p=p+1;因為是char*型別,所以只移動了乙個位元組。而且高位數存放在高位址,低位數存放在低位址,所以從低位數開始改變
ps:p=p+1 相當於p=p+sizeof(char)*1;
*p=『a』;
*p=『b』;
*p=『c』;
*p=『d』;
我們也不能做這樣的操作
int
*p;p=&10
;
這樣也是不對的,在給p傳位址時,我們不能對常量取位址
int p=&a(將a的位址傳給p,而不是p)
指標型別的大小是4位元組 例如
int a=10;
int b=20;
int*p=
null
p=&a; 這裡我們要注意,這是*p是a,而不是10
,a才是*p的指向,只不過a被賦值為10罷了
*p=100;p=
&b;*p=
200;
為了解釋指標的值的問題,在這我假設a的位址時0x0012ff28,他存放的是10,b的位址是0x0012ff1e,存放的是20。p的位址是0x0012ff10,存放的是a或b的位址0x0012ff28/0x0012ff1e,這要看程式設計師將誰的位址給了p。
那麼有下面的幾個等式
&p=0x0012ff10;
p=0x0012ff28/0x0012ff1e;
*p=a/b
*p=100(相當於給a賦值為100)
double x=
12.32
;int a=10;
char y=
'a';
由於x86系統採取的是小端存放,所以一般以其地位位址所謂某型別變數的首位址。
我畫圖來解釋。
以此類推,可知++p或者p++或者p+1這些加的都是對應型別的位元組數。
那麼自然有可能發生
char *p
int *p
double *p
的指標同時都指向了0x0012ff00,雖然都指向了地位的第乙個位址,但是代表的意義不同
雖然指標型別的大小是4位元組
但是每個型別的指標的識別能力是有限的,比如char型的指標,每次只識別記憶體中的乙個位元組來確定char的值,int型別的指標會識別4位元組記憶體來確定int的值。而double會識別8個位元組的位址。要注意,不同型別的指標不能相互賦值
還要注意我們在使用指標是切記不能定義野指標
我們需要注意的是,我們需要區分野指標和失效指標,我舉個例子來講解
如int *p;
這是上面的指標p就是野指標,我們為指標p開闢了乙個4位元組的記憶體空間,但是我們沒有給這個指標新增指向。那麼我們無法知道指標p的指向。
而 失效指標
比如
void
*fun()
當這個函式使用完畢後,返回的指標變為了失效指標,它依舊指向原來的空間,但是那塊空間依舊失效沒有了原來的主人。那麼即使得到了原來的結果,在實際上也是沒有意義的
int
*p;//沒有物件的指標
解決野指標的方法有
int
*p=null
;//令其為空
int*p=
&a//給他乙個物件
同時我們還要知道指標的下標操作
比如char *p = 「abcdef」;
此時p[2]值 為』c』。而p表示字串"abcdef"的首位址,*p的值則相當於p[0],值為』a』。
如果我們在函式中要呼叫指標,在使用前我們必須要進行判空操作
if
(p==
null
);
首先要知道指標都是四位元組的下面舉乙個例子
可以讓我們知道指各種型別指標的加一的範圍
char a3, a2, a1, a0;
char
*p3,
*p2,
*p1,
*p0;
char
**s;
//假設 a3, a2, a1, a0和*p3, *p2, *p1, *p0存放的記憶體空間都是連續的,並且s指向p
//求s+1 =4位元組
//*s+1 =4位元組
//**s+1 =其本身的數加一
s+1=s+sizeof(type*)*
1;//二級指標+1,指的是指標,+1加指標型別的4個位元組
*s+1
=s+sizeof
(type)*1
;//一級指標+1,指的是不同的型別變數,+1加的是指向型別的位元組數
**s+
1=數值加一//就是數值加一
接下來要說明指標變數在和0,null比較是的方式
指標變數作為if的判斷條件時,同樣有三種方式
a:if(p==0) if(p!=0)
b),if(p ) if(!p);
c) ,if(null == p); if(null != p);
哪一組或是那些組正確呢?我們來分析分析:
a)寫法:p 是整型變數?容易引起誤會,不好。儘管 null 的值和 0 一樣,但意義不同。
b)寫法:p 是 bool 型變數?容易引起誤會,不好。
c)寫法:這個寫法才是正確的,但樣子比較古怪。為什麼要這麼寫呢?是怕漏寫乙個 「=」號:if(p = null),這個表示式編譯器當然會認為是正確的
int
main()
所以同理也可以這麼做
int arr[3]
=;int x =10;
*((int
*)arr)
= x;
它的另一種寫法為:
// 在下面實現打包**
int*pi =
(int
*)buffer;
*pi = a;
char
*pc =
(char*)
(pi+1)
;*pc = c;
float
*pf =
(float*)
(pc+1)
;*pf = f;
// 在下面實現解包**
printf
("a = %d\n"
,*pi)
;printf
("c = %c\n"
,*pc)
;printf
("f = %f\n"
,*pf)
;
C 函式指標與指標識別
1 函式名與函式指標 函式名對應於該函式執行 的入口位址。通過取位址運算子 也可以取得函式的入口位址。指向函式的指標可以作為函式的引數傳遞。定義方式如下 返回型別 指標變數名 參數列 由於乙個函式不能以函式作為引數,所以當乙個函式需要將函式作為引數時必須借用指向函式的指標 也可以用包含該函式的類物件...
C語言 指標 數字 指標 指標
指標 數字 指標 1 指的是加乙個單元格,不同的指標型別需要調整,調整的權重為sizeof 去掉乙個 注意 arr i arr i eg double dp brr dp 乙個單元格是八個位元組 char cp crr cp 乙個單元格是乙個位元組 只有 指標 指標 有意義 1 先算出位元組數 2 ...
C 指標閱讀能力提公升
下面的識別符號你肯定在工程中看不到,但是在面試題中卻非常常見,掌握掌握還是不錯的。int p1 int int f int int p2 5 int int p3 5 int int p4 int int int p5 int 5 嵌入式軟體公司對指標的考察非常強,需要深刻的理解。右左法則 實在看不...