1. 程式人生 > 其它 >【C語言】基本指標型別及其常見錯誤

【C語言】基本指標型別及其常見錯誤

C語言基本指標型別及其常見錯誤

一、基本型別指標及其常見錯誤

可能導致記憶體洩露,或野指標

錯誤一:
#include <stdio.h>

int main(vodi)
{
    int * p;
    int i = 5;
    
    *p = i;    //error,無語法錯誤,*p指的是本程式以外的地址單元,本程式無權更改
    printf("%d\n",*p);
    
    return 0;
}
錯誤二:
#include <stdio.h>

int main(void)
{
    int i = 5;
    int * p;
    int * q;
    
    p = &i;
    *q = p;  // error,有語法錯誤,p是指標,*p是int型變數,二者型別不同
    printf("%d\n",*q);
    
    return 0;
}
錯誤三:
#include <stdio.h>

int main(void)
{
    int i = 5;
    int * p;
    int * q;
    
    p = &i;
    // *q = p; //error 語法編譯會出錯,p存放i的地址,*p指普通變數,二者不同
    // *q = *p; // error 語法無錯
    printf("%d\n",*q);
    
    return 0;
}
錯誤四:
#include <stdio.h>

int main(void)
{
    int i = 5;
    int * p;
    int * q;
    
    p = &i;
    // *q = p; //error 語法編譯會出錯,p存放i的地址,*p指普通變數,二者不同
    // *q = *p; // error 語法無錯
    p = q; // q是垃圾值,q賦給p,p也變為垃圾值
    printf("%d\n",*q);
    				/* q的空間是屬於本程式的,所以本程式可以讀寫q的內容,
    				   但是如果q內部是垃圾值,則本程式不能讀寫*q的內容
    				   因為此時*q所代表的記憶體單元的控制權限並沒有分配給本程式
    				   所有本程式執行到13行時,就會立即出錯
    				*/
    
    return 0;
}
二、星號的三種含義
  1. 乘法

  2. 定義指標變數

  3. 指標運算子

    放在定義好的指標變數的前面,*p表示以p的內容為指標的變數

三、通過指標為什麼可以是被調函式修改主調函式
#include <stdio.h>
int f(int i,int j)
{
    return 100;
    return 88; //88無法返回
}

int main(void)
{
    int a = 3,b = 5;
    
    a = f(a,b);
    b = f(a,b); //呼叫2次才可以修改b的值
}
#include <stido.h>
void g(int *p,int *q)
{
    *p = 1;
    *q = 2;
}

int main(void)
{
    int a = 3,b = 5;
    g(&a,&b);
    print("%d %d\n",a,b);
    
    return 0;
}
四、如何通過被調函式修改主調函式普通變數的值
  1. 實參必須為改普通變數的地址
  2. 形參必須為指標變數
  3. 在被調函式中通過( *形參名 = ...)的方式可以修改主調函式相關變數的值

------------------------------------------------

本文作者:ZyNu11,轉載請註明原文連結:https://www.cnblogs.com/zynu11/p/15413069.html