C語言指標,及指標識別能力

2021-09-05 08:43:51 字數 4116 閱讀 3775

在建立變數時 *號和變數名結合,不和型別名結合

編譯器在編譯時,是從右到左識別的,哪怕在定義時

(

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 嵌入式軟體公司對指標的考察非常強,需要深刻的理解。右左法則 實在看不...