1. 程式人生 > >2017.11.14 指針

2017.11.14 指針

基本 包括 時有 直接 輸出 ger () 運算 並不是

第八章 善於利用指針

(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指針”】
@【指針變量不能存放地址(指針)不要將一個整數賦值給指針變量, 例如:

pointer_1=10000;】

兩個有關運算符: &      取地址運算符      &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 指針