c語言指針的簡單實例


c語言的指針的存在使得c語言對硬件的操控,以及靈活性得到了極大的提高。

但是指針的使用存在着很多難點問題。

#include<stdlib.h>
#include<stdio.h>
//這里的函數是指針做參數的例子,要知道這個特性可以彌補c語言只能有一個返回值的特性。
void swap1(int *pa,int *pb){
    int t =*pa;
    *pa=*pb;
    *pb=t;
}
//main()函數必須要返回一個數字
int main(){
    int a =15;
    int b=10;
    int* t;
    t=&b;
    a=b;
    b=*t;
    printf("%d\n",b);
    swap1(&a,&b);
    printf("%p\t%p",a,b); 
    return 0;
}

這里我們先定義兩個整型的變量a,b

然后再定義一個臨時的指針變量,用來存儲中間變量

然后將b的變量的內存地址賦值給t,注意這里 t  代表的是內存地址

然后把b的值給a,再用b接受t地址所存儲的變量, 注意這里的*t是指t這個地址所指的那個變量。

 

指針與數組

其實數組的int a[10];

里來說a其實是這個數組的第一個元素的a[0]的指針

所以數組變量本身就是表達地址,所以

 1   int a[10];
 2   int *p=a; //無需用&取地址
 3 
 4 但是數組的單元表達的是變量,需要用&取地址  
 5   a==&a[0];
 6 
 7 []運算符可以對數組做,也可以對指針做:
 8 
 9 
10    p[0] <==>a[0];
11 這里的p[0]相當於*p
12 
13 *a可以表示a[0]
14 
15 數組變量是const的指針

const 這個修飾符的作用就是表明一個變量是指定的值不能改變了

int* const p=&i; //p是const

*q=26;//OK
q++; //ERROR
 1   int ls=58;
 2     int ls1=64;
 3     int* const q=&ls;
 4     *q =10;
 5     *q=20;
 6 //  q = &ls1;   這句是不能通過編譯的,因為這個指針是不能指向其他位置的地址 
 7     //執行成功說明這里的指針變量是可以被改變的
 8     ls=36 ;
 9     printf("\n%d",*q);
10     //然后我們來看另外一種情況
11     int P1=10;
12     int P2=20;
13     int const *T=&P1;
14     T=&P2;//執行結果為30
15     //*T =15;這里是不能通過編譯的,因為這個指針指向的位置存儲的變量是不能賦值改變的。 
16     P2=30; 
17     printf("\n%d",*T);
18     //關鍵在於這里的const是在*的前面還是后面決定的 
19     return 0;
1 void mai(const int*p){
2        
3        int *ls=*p; 
4            printf("ls的地址:%p",ls);
5 } 
6 這里我們傳入了一個指針,但是在函數里,是不能改變這個指針所指向的值的

 指針的運算

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 
 4 int main(){
 5     int i,j;
 6     i=10;j=12;
 7     printf("i,j:%d,%d\n",&i,&j);
 8     printf("i,j:%d,%d",*&i+1,&j);
 9     printf("\n&i-&j:%d",(&i)-(&j));//這里兩個地址做差其實是地址差/類型所占的位數
10 
11     int *p;
12     p=&i;
13     *p++;//實際上是*(p++);++優先級比*高;數組遍歷
14     printf("\n*p:%d",*p);
15     return 0;
16 }

指針的類型轉換

void*表示不知道指向什么東西的指針

指針變量的大小是相同的但是,指針是有類型的差別

 

總之指針的作用

1、需要傳入較大的數據的時候用做參數
2、傳入數組后對數組做操作
3、函數返回的結果不止一個的時候可以用指針帶出(c只能return一個變量,或者值)
     需要要用函數來修改不止一個變量
4、動態申請內存.......

具體的后續會更。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM