1、定義
a. 位址
記憶體單元的編號
從0開始的非負整數
b. 指標
指標就是位址,位址就是指標
指標變數是存放記憶體單元位址的變數
指標的本質是乙個操作受限的非負整數
2、基本型別的指標
int i=10;
int*p =
&i;//等價於int *p; p=&i;
*p=11
;printf
("%d %d"
,i,*p)
;//11 11
總結:
a.如果乙個指標變數(假定為p)存放了某個普通變數(假定為i)的位址,那我們就可以說:「p指向了i」, 但p與i是兩個不同的變數,修改p的值不影響i的值,修改i的值不影響p的值,但是改變*p的值也會改變i的值
b.p等價於i,或者說p可以與i在任何地方互換
c.如果乙個指標變數指向了某個普通變數,則*指標變數就完全等價於該普通變數
注意:a.指標變數也是變數,只不過它存放的不能是記憶體單元的內容,只能存放記憶體單元的位址
b.普通變數前不能加*
c.常量和表示式前不能加&
d.使用*p之前,指標p必須賦初值
int
*p;//p是個指標變數,int *p表示該p變數只能儲存int型別變數的位址
int i=10;
i=*p;
//出錯,p沒初始化不能這樣寫
3、指標和一維陣列
一維陣列名是個指標常量
它存放的是一維陣列第乙個元素的位址
它的值不能被改變
一維陣列名指向的是陣列的第乙個元素下標和指標的關係
a[i] <<==>> *(a+i)
假設指標變數的名字為p
則p+i的值是p+i*(p所指向的變數所佔的位元組數)
指標變數的運算
指標變數不能相加,不能相乘,不能相除
如果兩指標變數屬於同一陣列,則可以相減
指標變數可以加減一整數,前提是最終結果不能超過指標允許指向的範圍
p+i的值是p+i*(p所指向的變數所佔的位元組數)
p-i的值是p-i*(p所指向的變數所佔的位元組數)
p++ <==> p+1
p-- <==>p-1
#include
intchangearray
(int
*p,int len)
}int
main(){
int a[5]
=;int*point=
&a[0];
for(int i=
0;i<
5;i++)
printf
("/n");
changearray
(a,5);
for(int i=
0;i<
5;i++)
printf
("/n");
return0;
}
4、 如何通過被調函式修改主調函式中普通變數的值
形參為以該變數的型別為型別的指標變數
在被調函式中通過*形參變數名的方式就可以修改主函式相關變數的值
//形參名字是n,型別是int*
intf
(int
*n)int
main()
結構體是使用者根據實際需要自己定義的復合資料型別。
結構體變數不能加減乘除,但可以相互賦值。
struct student
;struct student stu1=
;struct student * ptr;
ptr=
&stu1;
ptr->sid=
1002
;printf
("%d %s %d"
,stu1.sid,stu1.name,stu1.age)
;stu1.name=
"lisa"
;//error
strcpy
(stu1.name,
"lisa"
);
在使用中,我們常用typedef給struct重新命名。
如:
typedef
struct lnodelnode,
*linklist;
相當於
typedef
struct lnode lnode;
typedef
struct lnode* linklist;
C語言 資料結構 預備知識指標
所有的偉大源於乙個勇敢的開始 資料結構預備知識 指標1.指標 是 c語言的靈魂,指標 位址 int p p是指標變數,int 表示該p 變數只能儲存 int型別變數的位址,不能存放別的型別的 int i 10 p i 詳細這兩部操作 1 p 存放了i 的位址,所以我們說 p指向了 i2 p和 i是完...
《資料結構》(c 版)預備知識
a1.數學術語 序列 乙個長度為n的序列是將n個元素按一定的線性順序住址起來,其特點是 1.序列中的元素有固定的順序 2.序列中的元素可以重複。向下取整 在c 中用函式floor實現。向上取整 在c 中用函式ceil實現。取模 取模是對整數的操作,它得到整除後非負的餘數,用a mod b表示,其中b...
資料結構之預備知識
指標是c語言的靈魂 位址 記憶體單元的編號 從零開始的非負整數 範圍 0 ffffffff 0 4g 1 指標 指標就是位址,位址就是指標 指標變數是存放記憶體單元位址的變數 指標的本質是乙個操作受限的非負整數 分類 1.基本型別指標 基本概念 int i 10 int p i 等價於 int p ...