歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

C語言指針簡單理解

 

先放一個程序

 

 

指針是什麼?網上主要有這麼幾種說法

 

1.指針就是一個存放地址的變量

 

2.指針是無符號整數a

 

3.指針是整型變量a

 

4.指針是地址

 

5.指針是一種類型

 


1.首先 指針肯定不是 整型變量  用sizeof看 是4個字節 而且可以用%d輸出。

 

  與其說是整型變量,還不如說是無符號整數呢,但是說指針是無符號整數也存在明顯的問題 下面用程序先推翻這兩種說法。

 

#include"stdlib.h"
#include "stdafx.h"
int main()
{
    int *p1 = NULL;
    int a = 20;
    unsigned int b = 30;
    p1 = a;//error
    p1 = b;//error
    p1 *= 5;//error
    return 0;
}復制代碼
  把無符號整數和整數變量分別復制給指針變量, 編譯器提示報錯,就說明,指針不是整型變量和無符號整數。(好理解)。

 

  而且 整數變量可以做乘法  指針變量不可以。

 

2.指針就是一個存放地址的變量

 

  或者說  指針就是地址 用下面的程序測試一下

 

    int a = 10;
    int b;
    b =&a;//報錯:不能從 int* 轉化為 int  這個證明了:普通變量不能存放地址  而指針變量可以存放地址(但是這個只是說明了 指針變量可以存放地址)

 

但是 指針不僅僅是一個存放地址的變量 而且 指針並不是地址   

 

  指針是不是只是一個地址呢?

 

  地址一般理解為內存單位的編號,是數字。

 

  那麼 我們用這個數字是否可以操作內存單位(用地址完成指針的工作)

 

1 int main()
2 {
3    int a = 10;
4    int b;
5    b =(int)&a;
6    *(b) += 20;//error
7    return 0;
8 }復制代碼
  第5行,將a的內存地址強制轉化為數字 存入b  然後用b操作a  結果呢 當然不可行

 

  提示非法的間接尋址  看來用地址是不能完成指針的任務、

 

重點來了:

 

  把這個地址變成指針如何?  

 

1 int main()
2 {
3    int a = 10;
4    int b;
5    b =(int)&a;
6    *((int*)b) += 20;
7    printf("%d", a);
8    return 0;
9 }復制代碼
  運行後發現,結果正常,成功通過地址操作了變量a 

 

  上文出現的錯誤 大多提示的是類型轉換的錯誤 (不能將 int *轉換為int類型) 看來編譯器是認為指針是一種類型

 

  而上面的一個程序 *(b) 不正確 *((int *)b)正確 而多出來的(int *)正是指針的類型

 

  或者說 指針由兩部分組成:  數據類型和地址。。

 

 

 

3.事實上 指針確實不僅僅包含地址 數據類型也是非常重要的

 

因為 數據類型決定了指針移動的步長  比如 char類型指針++ 地址每次+1 int類型指針 地址每次+4

 

更復雜的還有數組  指針在二維數組中非常重要  是行+1還是列+1 操作的指針是不一樣的

 

int main()
{
    int arr[100];
    printf("%d %d\n", arr, &arr);
    printf("%d %d\n", arr+1, &arr+1);
    return 0;
}

 

運行結果為:
9607420 9607420
9607424 9607820
請按任意鍵繼續. . .

 

第一行 兩個arr和&arr 都是首地址。

 

第二行 可以看出 arr+1 內存+4  &arr+1 內存+400

 

取地址的arr數據類型是整個數組 因此+1相當於+100*4

 

指針如果沒有類型,在讀取和寫入也會出問題。

 

因為是首地址,如果沒有類型,怎麼知道是讀取,寫入幾個字節呢。

Copyright © Linux教程網 All Rights Reserved