程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C言語指針復雜了解

C言語指針復雜了解

編輯:關於C++

C言語指針復雜了解。本站提示廣大學習愛好者:(C言語指針復雜了解)文章只能為提供參考,不一定能成為您想要的結果。以下是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;//error6     return 0;
7 }

  第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

 

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

由於是首地址,假如沒有類型,怎樣知道是讀取,寫入幾個字節呢。

 

(原創 但屬團體觀念 僅供參考)

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved