2017.11.14 指針
第八章 善於利用指針
(1)指針是什麽
1.內存區每一個字節都有一個編號,這就是“地址”。地址形象化的被稱為“指針”。它能通過以它為地址的內存單元。地址指向(*)該 變量單元。指向就是通過地址來體現。【指針是一個地址,指針變量是存放地址的變量】
2.在程序中一般是通過變量名來引用變量的值,這種直接通過變量名進行訪問的稱為直接訪問;
間接訪問:將變量 i的地址存放在另一變量中,然後通過該變量來找到變量i的地址從而訪問i變量。
@
(2)指針變量
使用指針變量的地址
例題1://通過指針變量訪問整型變量 #include<stdio.h> int main() { int a=100; int b=10; //定義a、b整型變量,並初始化 int *pointer_1; //定義指向整型數據的指針變量pointer_1 //*pointer_1表示指針變量pointer_1所指向的變量,也就是變量a 100 int *pointer_2; //定義指向整型數據的指針變量pointer_2 pointer_1=&a; //把變量a的地址賦給指針變量pointer_1, pointer_2=&b; //把變量b的地址賦給pointer_2 printf("a=%d,b=%d\n",a,b); printf("*pointer_1=%d,*pointer_2=%d\n",*pointer_1,*pointer_2); return 0; }
怎樣定義指針變量
定義指針變量額一般形式:類型名 * 指針變量名 ,指針變量是基本數據類型派生出來的類型,它不能離開基本類型而獨立存在
@ 例如: int pointer_1,pointer_2;
@
在定義指針變量時,同時對它初始化。
例如: int *pointer_1=&a;,*pointer_2=&b;
//指針變量前面的*表示該變量類型為指針變量。指針變量名為pointer_1 and pointer_2
//不能寫成“*pointer_1=&a; and *pointer_2=&b;”a的地址是賦給pointer_1
一個變量的指針的含義包括兩個方面:一是以存儲單元編號表示的地址(如編號為2000),一是它指向的存儲單元的數據類型,說明變量類型時應該是這樣說:a是指向整型數據的額指針變量,b是指向單精度數據類型的指針變量。
@【指向整型數據的指針類型表示為 int ,讀作“指向int 的指針”或者簡稱 “int指針”】
@【指針變量不能存放地址(指針)不要將一個整數賦值給指針變量, 例如:
兩個有關運算符: & 取地址運算符 &a是變量a的地址
* 指針運算符 *p代表指針變量p指向的對象
怎樣運用指針
在引用指針時有三種情況 1.給指針變量賦值; 例如:p=&a;//把a的地址賦給指針變量p;;;;int * 讀作int指針 2.引用指針變量指向變量; 例如:已執行p=&a; printf("%d",*p); //a指向整型數據的指針變量 3.引用指針變量的值; 例如: printf("%o",p); 例題2://輸入ab兩個整數,按先大後小的順序輸出a和b #include<stdio.h> int main() { //int *p1; //int *p2;//p1,p2的類型是int *型 int *p; int a; int b; printf("please enter two integer numbers:"); scanf("%d,%d",&a,&b); int *p1=&a; //使p1指向變量a int *p2=&b; //使p2指向變量b if(a<b) { p=p1; p1=p2; p2=p;//p1 p2互換值 //換成p1=&b;p2=&a; } printf("a=%d,b=%d\n",a,b); printf("max=%d,min=%d\n",*p1,*p2); return 0; } //a和b的值並未交換,它們仍保持原值,但p1和p2的值改變了,p1的值原為&a,後來變成了&b
指針變量作為函數參數
例題2://對輸入的兩個整數大小按大小順序輸出。先用函數處理而且用指針類型的數據作函數參數。
#include<stdio.h>
int main()
{
void swap(int *p1,int *p2);//聲明swap函數
int a;
int b;
int * pointer_1;
int * pointer_2;//定義兩個指針變量
printf("please enter a and b:");
scanf("%d,%d",&a,&b);
pointer_1=&a; //pointer1指向a
pointer_2=&b; //pointer2指向b
if(a<b)
swap(pointer_1,pointer_2);//如果a大於b調用swap函數
printf("max=%d,min=%d\n",pointer_1,pointer_2);
return 0;
}
swap(int *p1,int *p2)
{
int temp;
temp=*p1;
*p1=*p2;
*p2=temp;
}
(3)通過指針引用數組
1.數組元素的指針
@一個變量有地址,一個數組包含若幹個元素,每個數組元素都在內存中占用存儲單元,它們都應有相應的地址。所謂數組元素的指針就是數組元素的地址。
1可以用一個指針變量指向一個數組元素。引用數組元素可以用下標法也可以用指針法(好)
例如:
int a[5]={1,23,56,9,8};//定義a為包含5個整型數據的數組
int *p; //定義p為指向整型變量的指針變量
int *p=&a[2];// p=&a[0]; //把a[0]的地址賦給指針變量p,p=1.
2.在C語言中數組名(不包括形參數組名,形參數組並不占用實際的內存單元)代表數組中的首個元素。數組名不代表整個數組,只代表數組首元素的地址。
例如:p=&a[0];p的值是a[0]的地址
p=a;//p的值是數組a首元素
2.在引用數組元素時指針的運算
指針就是地址。在一定條件下允許對指針進行加和減的操作運算。
在指針指向數組元素時,可以對指針進行以下操作:
加/減一個整數(+或+=),例如:p+1;p-1
自加自減,例如:p++/p--
兩個指針相減,例如:p1-p2(p1和p2指向同一數組中的元素有效)
分別說明如下:如果指針變量p已指向數組中的一個元素,則p+1指向同一數組中的下一個元素。註意:執行p+1時並不是將p的值簡單地加一而是加上一個數組元素所占用的字節數。
例如:數組元素是float型,每個元素占用四個字節,則p+1意味著使p的值加4個字節(實際上是p+1*d)d是一個數組元素所占的字節數
對int型 每個元素占用4個字節;char型是一個元素為一個字節;float和double每個元素占用4個字節
(5)通過指針引用數組元素
引用一個數組元素可以用兩種方法:下標法,例如a[i] ;指針法:(a+i) 或者 。(p+i)。其中a是數組名,p是指向數組元素的指針變量,其初值為p=a
2017.11.14 指針