第八章: 指標
知識結構:
1)指標的基本概念
2)怎麼定義指標
3)指標的運算
1)指標的基本概念
記憶體:以位元組為單位,由若干個位元組組成
為了便宜管理,給每個位元組編號(十六進製制)
每乙個位元組的編號在整個記憶體都是唯一
定義變數:在計算機記憶體中去預定記憶體
各類變數所預定的空間大小不同
整型:int tc 2位元組 vc 4位元組
long tc 4位元組 vc 4位元組
short tc 2位元組 vc 2位元組
實型:float tc 4位元組 vc 4位元組
字元型: char tc 1位元組 vc 1 位元組
變數的位址,指向變數的指標
用來儲存變數位址的變數,指標變數
指標變數只能儲存位址,型別必須要一致才能儲存
scanf("%d",&a);
2)定義指標變數
int a,b;
int *p,*q;
型別名 *指標變數名1,*指標變數名2...
型別名 :該指標變數的基本型別,只能儲存對應型別變數的位址
*:指明該變數是一指標型別的變數(只能儲存位址)
float *ft1,*ft2;
double *db1,*db2;
指標變數名: 不包括*號
怎麼樣去訪問變數的內容:
1)拿到該變數的位址,直接對該位址進行訪問
2)通過指標變數來間接訪問儲存單元
怎麼樣給指標變數賦值:
int a,b;
int *p,*q;
獲取變數的位址:
可以用取位址運算子 (&),將變數的位址取出
&《變數名》 : 將指定變數的首位元組的編號拿到
得到指定變數的位址
p = &a; :將a的位址取出儲存到指標變數p中
通過p可以間接訪問變數a
p就是指向變數a的指標
q = &b;
注意: 指標變數的型別必須和變數的基型別是一致才能儲存
q = 10; /*指標只能儲存位址值*/
int a,b,*q,*c,*p;
p = &a;
q = &b;
c = p; /*將p中的內容取出,賦值給指標c,使指標c和指標p同時指向p所指向的變數*/
可以讓指標不指向任何儲存單元:
int *p;
p = null;
p = 0;
p = '\0';
上面三種方式,都可以使指標p沒有指向
int a,*p;
int **q;/*指向指標的指標變數*/
p = &a;
q = &p;
指向指標的指標變數:
基本型別 **指標變數名1,**指標變數名2...
只能儲存指標變數的位址,指向的是指標
用指標怎麼樣來訪問變數:
*指標變數名;
*: 運算子將指標所指向的變數內容訪問出來
int a,*p;
a = 10;
p = &a;
a <=> *p
int a,*p,**q;
a = 10;
p = &a;
q = &p;
a *p **q
& *都是單目運算子
左邊必須是乙個變數名,不能表示式或常量
左邊必須能夠代表乙個唯一的儲存單元位址
錯誤賦值表示式:
(a+b) = 10
10 = 10
從鍵盤上輸入兩個整數,然後輸出
*:定義語句**現時,表示該變數是乙個指標變數
執行語句**現時,代表間接訪問指標變數所指向變數的值
#include "stdio.h"
void main()
10 20
a=10,b=20
press any key to continue
1)指標變數在定義時就可以給其進行初始化操作
*:定義語句**現時,表示該變數是乙個指標變數
執行語句**現時,代表間接訪問指標變數所指向變數的值
2)凡是出現&a地方,都可以指標p去代替
3)凡出現a的地方,都可以用間接訪問指標去代替(*p)
指標: 為操作儲存單元提供一種間接的訪問方式
直接訪問變數名屬於直接操作
2.交換a,b兩個變數的值(指標來操作)
#include "stdio.h"
void main()
10 20
1)a=10,b=20
2)a=20,b=10
press any key to continue
3.輸入兩個數,找出最大值(用指標來操作)
#include "stdio.h"
void main()
90 50
max = 90
press any key to continue
#include "stdio.h"
void main()
a=10,a=10
press any key to continue
單目運算子:
1) ! 邏輯非
2) + 正號
3) - 負號
4) ++ 自增
5) -- 自減
6) & 取位址
7) * 間接訪問
8) (型別名) 強制型別轉換
平級: 結合性右結合 (從右到左的運算順序)
運算過程中: 先按優先級別去運算,同級的按結合性去運算
int a,*p;
p = &a;
*p <=> *(&a) <=> a
int a=10,*p=&a;
(*p)++ *p++ 10 &a+1*2
10p = p + 1;
1: 乙個儲存單元(針對與不同型別的變數,1所代表的位元組數有所不同)
移動兩個位元組 (tc環境)
int a,*p;
p = &a
p++ 表示式的值: &a p不再指向a變數,而指向 a所代表儲存單元的後兩個位元組的地方
++p 表示式的值: &a + 1*sizeof(int)
sizeof(基本型別關鍵字) : 返回是指定的型別
在當前環境中所佔的位元組數
指標可以和整數進行運算
可以代表乙個位址(某乙個位元組的編號)
int a;
double b,*p;
p = &b;
p = &a;/*錯誤*/
p+1 表示p指標所指位置的下乙個位置
p+1 <=> &b+1*sizeof(double) <=> &b+1*8
p+5 <=> &b+5*sizeof(double) <=> &b+5*8
p++ <=> p = p + 1
要讓指標重新定位指向,需要重新各其賦值
指標的移動,必須針對一片連續的儲存單元才有意義
對於單個變數來說,指標的移動將讓沒有辦法控制指標
#include "stdio.h"
void main()
1010
1111
press any key to continue
1011
press any key to continue
a = 10
(*p)++ 10 *p = 11
(a)++ 10 a = 11
a=10;p=&a;
*p++ p++ &a p=&a+1*sizeof(int)
*(&a) 10 *p
i=1a=i++ a=i i=i+1
++i i=i+1 a=i
a=10,*p,*q
p=&a;
q=p++ q = p p=p+1
q=++p p=p+1 q=p
b=(*p)++ b=*p *p = *p + 1
b=++(*p) *p = *p + 1 b = *p
b = *p++ <=> b = *(p++)
b = *p++ b=*p p=p+1
第八章:指標02
1.指標的概念
位址2.指標變數定義
指標變數的賦值
int a,b,*p,*q,*k;
p = &a;
q = p;
k = null
k = 0
k='\0'
3.指標的運算
(*p)++
++*p
*p++
int a=1,b;
b = a++ b=a a=a+1
b = ++a a=a+1 b=a
int a,*p,*q;
p=&a;
q=p++ q=p p=p+1
q=++p p=p+1 q=p
int a,*p,*q;
p=&a;
p+1int a=10,b,*p=&a;
b = (*p)++ b=(*p) *p=*p+1
b = ++(*p) *p=*p+1 b=*p
b = *p++ b=*p p=p+1
b =*(++p) p=p+1 b=*p
4.指標變數作為函式的形參
從被呼叫函式向呼叫函式返回引數時:
1)return返回乙個引數
2)用指標變數作為形參來間接操作實參的值
3)通過全域性變數來實現
輸入兩個整數,然後對其值進行交換
#include "stdio.h"
void main()
從函式的角度:
#include "stdio.h"
void jh(int a,int b);
void main()
{ int a,b;
scanf("%d%d",&a,&b);
C語言指標小結
輸出結果同上。指標變數位址加1 inti,pa,a pa a for i 0 i 9 i 輸出結果同上。2 陣列名與指標的區別 陣列名是指標常量而指標是指標變數,舉乙個例子。inti,pa,a pa a for i 0 i 9 i 輸出結果同上。這裡如果將pa換成a,那麼編譯就會出錯。原因pa是指標...
C語言中指標的考點
考點一變數的位址和指標 1 位址和指標的定義 1 記憶體位址 計算機的記憶體是以位元組為單位的一片連續的儲存空間,每個位元組都有乙個編號,這個編號就稱為記憶體位址。一般情況下,在程式中只需指出變數名,無須知道每個變數在記憶體中的具體位址。程式中對變數驚喜訪問操作,實際上也就是對某個位址的儲存單元進行...
超經典的C語言指標講解
pointer 1 a pointer 2 b if a printf a d,b d pointer 1,pointer 2 return 0 void swap int p1,int p2 子涵數中將p1指向的變數 a 與p2指向的變數 b 互換,即將a和b的值互換,也就是a中放的是9,b中放的...