指標的初始化

2021-06-22 22:11:05 字數 2620 閱讀 2357



下面的函式有什麼錯誤: 

int square(volatile int *ptr) 

這段**的目的是用來返指標*ptr指向值的平方,但是,由 

於*ptr指向乙個volatile型引數,編譯器將產生類似下面的**: 

int square(volatile int *ptr) 

由於*ptr的值可能被意想不到地該變,因此a和b可能是不同的。結果,這段**可能返不 

是你所期望的平方值!(本人理解:理論上是這樣,但是經過多次試驗,沒發現有問題,姑且先這樣記著吧!)

正確的**如下: 

long square(volatile int *ptr) 

除錯的程式:

#include

int square(volatile int * ptr)

//  return *ptr**ptr;

int a,b;

a = *ptr;

b  = *ptr;

//return a*b;

return a*a;

void main()

int a = 10;

int *i = &a; //指標初始化 int *i = null

b = square(i);

printf("the square of a is:%d\n",b);

(1)一般應該是

int a[5],b; 

int *p=a; 

int *q=&b; 

為什麼呢?int *p=&a;

運算順序是

int *(p=&a)

而不是int (*p)=(&a);

一般的初始化指標可以通過以下的一些方法: 

int *q=0;  int *p=null; 

初始化指標變數q,

有兩個作用,首先會在當前系統堆疊區給

q開闢乙個隨機位址

&q,同時將

*q(指標

q所指向的空間的內容)的值修改為0。

具有值null

的指標不指向任何值。 

int *p,a; p=&a; 

或者定義的時候就初始化,或者int *p=&a; 

2.指標裡存放的雖然是位址,而且位址長度是一樣的,位址長度是一樣的

sizeof(int *) 

和sizeof(char*)在32

位機器都是

4個位元組,

但是定義不同型別的指標

意義在於程式執行時需要確切地知道如何移動指標,以及如何讀取指標所指單元的內容。 

比如:int a[10]; int *p = a; 

現在p指向陣列的首位址假設這個位址是

0x00000000

,那麼*p = a[0]

那麼怎麼指向

a[1]

呢?執行

p = p+1

後 *p=a[1]

了請注意 

p=p+1不是 

0x00000000+1

而是0x00000000+4

(在32

位的機器上

)為什麼是加

4而不是加

1 因為

int型在32

int a;  

char *p;  

a=4;/*輸出的值是否相等取決於此處的賦值範圍

*/ 

p=&a;  

printf("%d\n",a);  

printf("%d\n",*p);  

如果a在-128~128

間輸出都是相等的超出範圍後就不一樣了。

這個就像我上面說的如果是char

型那麼printf

函式從指標開始讀取

1個位元組輸出,如果是

int型那麼

printf

函式從指標開始讀取四個位元組 

a = 4 

在記憶體中儲存的為 

0x04 0x00 0x00

x00(

intel

的cpu

應該是這樣儲存的不同的

cpu是不一樣的好像位址依次增加)所以噹噹a在

-128~128

時printf("%d\n",a); printf("%d\n",*p); 

都輸出0x04 

(從指標開始讀取乙個位元組和

4個位元組是一樣的)如果a大於

128  

比如在記憶體中儲存的為 

0x04 0xff 0x00 0x00

這樣printf("%d\n",*p); 

就只讀取了 

0x04

,0xff

被拋棄了,所以就不一樣了。 

3.陣列指標的初始化 

如果要將一塊位址空間(

也就是針變數裡的值置零

)進行初始化,一般這麼寫: 

char 

pstr[20]=;

//初始化時這麼寫,或者是: 

memset(pstr,null,sizeof(pstr));

//**中這麼寫,當然也可以是動態分配。 

char *pstr = new char[20];//

只要記住

delete

**記憶體就可以了  

初始化指標

includeusing namespace std int main nullptr 是 c 新標準引入的特性,visual c 2010 編譯器支援它。過去已經使用0或 null 編譯器將用 0代替此巨集 來初始化指標,當然它們現在仍然可以使用。但是,使用 nullptr 初始化指標要好得多。因...

指標的初始化

指標代表的是記憶體單元的編號或位址,通過指標就可以找到對應的記憶體單元。對指標進行初始化或賦值的實質是將乙個位址或同型別 或相相容的型別 的指標賦給它,而不管這個位址是怎麼取得的。1 指標的初始化 指標初始化時,的右運算元必須為記憶體中資料的位址,不可以是變數,也不可以直接用整型位址值 但是int ...

指標的初始化

1.字元指標的初始化 在c語言中 string 儲存的就是首個字元所在的位址 所以可以把 字串常量 string 賦值給指標 char p p string 但不能把字串常量直接賦給陣列,需要用到 strcpy。但可以對陣列初始化為字串,也就是字元陣列。如 char str string 兩種初始化...