如果把某一塊已經開闢的記憶體空間比作房間,那麼指標就是一把鑰匙。房間有大有小,而鑰匙就那麼大,所以指標所占用的位元組為4位元組。這把鑰匙可以根據你的設定來讓它開哪個房間,但是,最多只能開乙個房間。
1、定義
我們平常見到的定義指標有兩種寫法:int *p
和int* p
,其實這兩種寫法效果是一樣的,但是為了避免混淆,建議採用第一種int *p
,因為如果你同時定義了乙個指標變數和乙個普通變數,如:int* p,a;
你可能以為定義了兩個指標p和a,所以採用第一種能避免混淆。
2、賦值
賦值方式有兩種
定義時賦初值:int a; int *p=&a
先定義,後賦初值:int a; int *p; p=&a
3、陣列首位址賦給指標
&作為取位址符,*是取值符,如果指標指向的是單個變數,直接用 *將p指向位址的值取出即可:cout<<*p《一般呼叫函式傳參都是值傳遞,如果函式引數時指標的話,那麼呼叫函式時就得將相應位址傳過去,所以函式執行過程中進行的一系列操作也是對位址進行的操作,也就改變了實參的值。常見的位址傳遞有:
(1)傳遞陣列名進行排序mysort(arr,len)
(2)排序過程中兩個數交換swap(&arr[i],&arr[j])
在c語言中,乙個字串常量不可以直接賦給乙個陣列,比如:char s[10]; s="hello";
這種寫法是錯誤的。但是乙個字串卻可以直接賦給乙個指標:char *p; p="hello";
這僅限於將乙個字串常量的位址賦給指標p,但如果char s[10]; char *p=s; *p="hello";
這就是非法的,這就相當於直接把字串常量賦給乙個陣列,其實字串常量賦給乙個陣列可以採用strcpy()函式。
函式的返回值也可以是指標型別,前提是這個指標指向的內存在函式呼叫後不會被銷毀,在這裡不做過多說明。
例如:
int a=10;
int*p=
&a;//取a的位址傳給p
int*
(*pp)
=&p;
//取p的位址傳給pp
//如何引用:
cout
*p
*pp)
/因為*pp相當於p,所以*(*pp)相當於*p也就是a
const修飾常變數,如何理解?例如:const int a=10;
這就定義了乙個常變數a,a的值不可修改。
再論指標,指標有兩個東西可變:
int a=10; int *p=&a;
1、指標指向的位址裡面存放的值可變*p=5; //a的值變為5
;
2、指向的指向可變int b=10; p=&b; //p的指向被改為a
;
因此,const在不同地方修飾就有不同的效果
如:(1)int a=10; const int *p = &a;
此時const修飾int,代表*p的值不可改變,也就是p指向的值不可以改變,但p的指向可以改;
(2)int a=10; int const *p = &a;
此時const修飾p,代表p的指向不可改變,但p的值可以改變。
(3)int a=10; const int* const p=&a;
由此類推此時p的指向和p指向的值都不可改變
void代表空,大家就很疑惑為什麼指標還有空型別,有人可能以為void型別指標可以指向任何型別的資料,這種理解是錯誤的。應該理解為「指向空型別」或「不指向確定型別」的資料,那麼如何指向空型別呢?舉個例子:
int a=3;
int*p1=
&a;void
*p2=
(void
*)p1;
// 這一句就是將乙個指向int型別的指標轉化為空型別指標然後賦給p2;
cout<<
(int
*)p2/在呼叫時,還得將空型別指標轉換為原型別指標才可以調出資料
變數定義
型別表示
含義int i;
int定義為整型變數i
int *p;
int *
定義p為指向整型資料的指標
int a[5];
int [5]
定義乙個整型陣列
int *p[4];
int *[4];定義乙個指向整型資料的指標資料
int (*p)[4]
int (*)[4]
定義乙個包含4個元素的一維陣列指標變數
int f();
int ()
定義乙個函式,返回值是整型
int *p()
int *()
定義乙個返回值為整型指標的函式
int (*p)();
int (*)()
定義乙個指向返回值為int型別的函式
int **p;
int **
定義乙個指向【指向整型的指標】的指標
int const *p;
int const *
定義乙個指向不可修改的指標
const int *p;
const int *
定義乙個指向的值不可修改的指標
const int* const p;
const int * const
定義乙個指向和指向的值都不可修改的指標
void *p;
void *
定義乙個空型別指標
大家如果將這些全部弄清楚指標這塊就差不多可以了 ^ _ ^
C語言指標關鍵知識點總結
三 指標對比 四 空指標null與nul以及void指標 在我們目前所學到的語法中,星號主要有三種用途 如果乙個指標指向了陣列,我們就稱它為陣列指標 array pointer 重點 陣列名是常量,它的值不能改變,而陣列指標是變數 除非特別指明它是常量 它的值可以任意改變。也就是說,陣列名只能指向陣...
C語言知識點總結
有段事件沒有寫c程式了,有些地方有些生疏了。這兩天事情比較少,準備再系統的看一邊c的基礎知識。這裡再總結一下平時沒太注意的知識要點。1 c語言的語句塊在c語言中,任何允許出現語句的地方既可以是由 號結尾的一條語句,也可以是由 括起來的若干條語句或宣告組成的語句塊 statement block 語句...
C語言知識點總結
以下內容為本人對c語言中經常忘記但是又重要的知識點的總結。i,i 在使用i之前,先使i的值加 減 1 i i 在使用i之後,使i的值加 減 1 continue 結束本次迴圈語句 break 中止執行switch或迴圈語句 if語句常用的三種形式 while迴圈,for迴圈,do while迴圈都可...