前言:以上的入門篇知識均來自譚浩強c語言書籍,清華大學出版社。其中例子均屬本人胡鄒。與原書作者毫無關系。
入門的指針學習,將從七個方面進行介紹,這是指針最基本的用法,需要掌握。
一、地址和指針的概念
1.地址:內存區的每一個字節有一個編號,這就是地址。來自百度百科:由于我們現在使用的是80x86這種微處理器,所以我們可以把地址分為三類:第一類:邏輯地址:機器語言指令仍用這種地址指定一個操作數的地址或一條指令的地址。這種尋址方式在Intel的分段結構中表現得尤為具體,它使得MS-DOS或Windows程序員把程序分為若干段。每個邏輯地址都由一個段和偏移量組成。
第二類線性地址:線性地址是一個32位的無符號整數,可以表達高達2^32(4GB)的地址。通常用16進制表示線性地址,其取值范圍為0x00000000~0xffffffff。
第三類物理地址:也就是內存單元的實際地址,用于芯片級內存單元尋址。物理地址也由32位無符號整數表示。
2.指針:將地址形象化的稱為“指針”。意思就是通過她能找到以他為地址的內存單元。在信息科學中,指針一般指向一個函數或一個變量。在使用一個指針時,一個程序既可以直接使用這個指針所存儲的內存地址,又可以使用這個地址里存儲的函數值。
指針和指針變量是不同的兩個概念:指針是一個地址,而指針變量是存放地址的變量。
例外還有一個概念:直接訪問:就是按照變量地址存取變量值的方式,間接訪問:將變量i的地址存放到臨沂個變量中。舉個例子:你跟小三約好去開房,有兩種方式見到她,第一種就是小三饑渴的不行,直接和你約見面的地點,打開門就看見她。這叫直接訪問,另外一種就是,小三說,想跟你玩個游戲,當你打開見面的房門里邊有個紙條,上邊寫著,今天來點刺激的,寫下了一個地址,xx樂園魔天倫28號。于是你就是哪里找她了。這就叫間接訪問。
二變量的指針和指向變量的指針變量
變量的指針就是變量的地址,存放變量地址的變量是指針變量,他用來指向另外一個變量。在信息工程中,“*”符號表示“指向”的對象。如果定義i_pointer所指向的變量。
1定義一個指針變量
c規定,在所有的變量使用前,必須要定義變量,指定其類型,這樣方便分配內存單元。但是指針跟其他變量不一樣,他是用來專門存放地址的。
特別注意兩點:第一,‘*’代表的是指針類型。第二,指針變量必須有類型,因為不同的指針變量類型,在操作時會受到影響。
2指針變量的引用
指針變量中只能存放地址(指針),不要將一個整數(或者任何其他非地址類型的數據)復制給一個指針變量。
*i_pointer_1=100;(不合法);
兩個運算符需牢記:
(1)&:取地址運算符。
(2)*:指針運算符(或稱“間接訪問”運算符),
取指針所指向的對象的內容。
E.p:&a為變量a的地址,*p為指針變量p所只想的存儲單元的內容(即p所指向的變量的值)
如:通過指針變量訪問整形變量。
#include
void main()
{ int a,b;
int *pointer_1,*pointer_2;
pointer_1=&a;
pointer_2=&b;
a=100;b=10;
printf(“%d,%d\n”,a,b);
printf(“%d,%d\n”,*pointer_1,*pointer_2);
}
特別注意:(括號的重要性)(*pointer_1)++相當于a++。注意括號的必要性,如果沒有括號,就成為了*pointer_1++,++與*是同一級別運算符,因此結合方向自右向左,它相當于*(pointer_1++)。由于++在pointer_1的右側,是后加,因此先對pointer_1的原值進行*運算,得到的a值,然后使pointer_1的值改變,這樣pointer_1不再指向a了。
3指針變量作為函數參數
函數的參數不一定是整型,浮點型,字符型等數據,也可以是指針類型,他的作用是將一個變量的地址傳送到另一個函數中。
E.m:比較兩個整數,順序輸出整數。
#include
void main()
{ void swap(int *p1,int *p2); //聲明一個函數,在后邊需要使用。
int a,b;
int * pointer_1,* pointer_2;
scanf(“%d,%d”,&a,&b);
pointer_1=&a; pointer_2=&b;
if(a
printf(“%d,%d\n”,a,b);
}
void swap(int *p1,int *p2)//前邊聲明的函數
{ int temp;//定義為int temp,而不是int*temp,因為交換的是值。
temp=*p1;
p1=p2;
*p2=temp;
}
三、數組與指針
數組在內存中占用存儲單元,并且有相應的存儲地址。指針可以指向int,char,等變量類型,也可以指向數組。所謂的數組元素的指針就是數組元素的地址。
1數組元素的指針
它的賦值方式int*p=&a[0]//把數組a0的地址賦值給p;
它也等價于:int*p;p=&a[0];
2通過指針引用數組變量
E.m:輸出數組中的全部元素。下面介紹三種方法:
(1)下標法
#include
void main()
{ int a[10];//數組中一共有十個元素,所以數組下標一定要注意。
int i;
for(i=0;i<10;i++)
scanf(“%d\n”,&a[i]);
for(i=0;i<10;i++)
printf(“%d\n”,a[i]);
}
(2)通過數組名計算數組元素地址,找出元素的值
#include
void main()
{ int a[10];//數組中一共有十個元素,所以數組下標一定要注意。
int i;
for(i=0;i<10;i++)
scanf(“%d\n”,&a[i]);
for(i=0;i<10;i++)
printf(“%d\n”,*(a+i));//利用數組的名稱計算地址。不能寫成*a+i,意義完全不同。
}
(3)用指針變量指向數據元素
#include
void main()
{ int a[10];
int i,*p;
for(i=0;i<10;i++)
scanf(“%d\n”,&a[i]);
for(p=a;p
printf(“%d”,*p);
}
比較:(1),(2)兩種方法的時間復雜度相等,(3)比其他兩種方法快。原因在于:用指針變量直接指向元素,不必每次都重新計算地址。
四、字符串與指針
1字符串的表示形式
c語言中,有兩種方式可以訪問一個字符串,第一是:用字符數組存放一個字符串,然后輸出。第二是,用字符指針指向一個字符串。
以上基礎入門篇的一部分學習,還有許多知識點需要進一步學習。
開始寫Log的原因是因為想要去華為工作,現在進行知識點的惡補,因為好久沒有使用c了。看看自己在準備的這個過程中能學到多少東西,進行總結,可以進行客觀的學習效率評價。
2016/8/20