下面的函式有什麼錯誤:
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 兩種初始化...