C語言第四篇:指標的辨析

qq_30866297發表於2016-03-22


一、基礎


地址:記憶體區的每一個位元組都有一個編號,這個編號就稱為地址。

指標:一個變數的地址稱為指標。

指標變數:專門用來存放指標(一個變數的地址)的變數稱為指標變數。

定義方法:

基型別    *指標變數名;

        如:int   *p1;   float   *p2;


二、疑難


1、記憶體單元的存取/訪問方式

(1)直接訪問——通過變數名訪問,如:printf("%d\n",a);
(2)間接訪問——通過指標變數訪問,如:printf("%d\n",*p);

2、指標運算子與取地址運算子

*p——指標變數p所指向的儲存空間(裡面的值)
&p——指標變數p的地址
&*p——就是p指標
*&p——就是p指標
下面用一段程式程式碼來辨析以上表示式:

測試程式碼:
/*
*Copyright (c)2016,劉兵馬俑
*All rights reserved.
*檔名稱:main.c
*作    者:劉兵馬俑
*完成日期:2016/03/22
*版 本 號:v1.0
*問題描述:C語言的指標運算子與取地址運算子辨析
*程式輸出:不同表示式的值
*/
#include <stdio.h>

int main( )
{
    //定義整型變數和整型指標
    int a=1;
    int *pointer=&a;
    //輸出整型變數的值以及指標的初始值
    printf("整型變數  a = %d\n",a);
    printf("指標變數  pointer = 0x%0x(&a)\n\n",&a);

    //輸出需要辨析的表示式
    printf("a         —— %d    \n",a)        ;
    printf("&a        —— 0x%0x \n",&a)       ;
    printf("*&a       —— %d    \n",*&a)      ;
    printf("pointer   —— 0x%0x \n",pointer)  ;
    printf("&pointer  —— 0x%0x \n",&pointer) ;
    printf("*pointer  —— %d    \n",*pointer) ;
    printf("&*pointer —— 0x%0x \n",&*pointer);
    printf("*&pointer —— 0x%0x \n",*&pointer);

    return 0;
}

執行結果



結論:*和& 是一對互逆運算子

三、指標變數使用禁忌——野指標


野指標情況(一)—— 指標使用前未初始化

若指標定義時未初始化,則不能使用“*p=10;”對p指標所指向的記憶體單元賦值,原因是指標必須在指向明確的前提下才能對其賦值。


野指標情況(二)—— 不能用整數為指標變數賦值,如:

int *p;
p=0x100000;
這是錯誤的。

總之,OS對於記憶體空間的管理是十分嚴格的。







相關文章