c語言中函數的參數、對象、地址、取址運算符、指針運算符。


1、c語言中函數的參數

01、c語言中實參向形參的傳遞過程是單向傳遞的,在對形參進行修改后的值不能返回給實參。

02、函數返回調用源的返回值只能有一個。

例、求兩個數的和與差。

#include <stdio.h>

void sum_diff(int x, int y, int sum, int diff)
{
    sum = x + y;
    diff = (x > y) ? (x - y) : (y - x);    
} 

int main(void)
{
    int a, b, wa = 0, sa = 0;
    
    puts("please input two integers.");
    printf("a = "); scanf("%d", &a);
    printf("b = "); scanf("%d", &b);
    
    sum_diff(a, b, wa, sa);  //wa,sa作為實參傳遞給形參sum和diff,sum和diff在調用函數時重新進行了賦值,但是並不能返回給函數的調用位置main函數中的變量。(實參→形參,單向復制) 
    // wa和sa的值仍然是在main函數中的值0.
    printf("\nwa: %d || sa: %d\n", wa, sa);
    
    return 0;
}

 

 

為了解決這個問題(對傳入函數中的變量的值進行修改,並返回調用源),需要c語言中的指針。

 

2、對象和地址

001、對象是不是就是變量???

002、變量擁有多種屬性:數據類型、存儲期、變量名等。

003、對象:繼承了變量屬性而創建的變量實體稱為對象。

004、地址:指的是對象的地址。 對象在內存上的存儲位置編號。  本質:存儲位置編號(指針)。

 

3、取址運算符

001、取址運算符:單目運算符 &稱為取址運算符。

002、將取址運算符放在對象(變量)的前面,就可以獲得對象的地址(存儲位置編號)。

003、取址運算符&的作用是獲取對象的地址,生成指向對象的指針。(與其說是獲取地址,不如說是生成指針)。

004、對象地址的轉換說明為%p,其中p為pointer的首字母。

005、取址運算符&寫在Type型變量x的前面,&x為Type*型指針,其值為x的地址。

示例程序如下:

#include <stdio.h>

int main(void)
{
    int n;
    double x;
    int a[3];
    
    printf("nnnn:  %p\n", &n);   //&取址運算符,獲取地址,生成指向對象(n)的指針 
    printf("xxxx:  %p\n", &x);   //%p為對象地址的轉換說明,p為pointer的首字母 
    printf("a[0]:  %p\n", &a[0]);
    printf("a[1]:  %p\n", &a[1]);
    printf("a[2]:  %p\n", &a[2]);
    
    return 0; 
}

 

 

4、指針運算符

001、單目運算符*稱為指針運算符。

002、指針運算符的作用:1、生成指針變量,eg:int *x; 生成指針變量x,2、獲取指針所指對象的值。 eg: *p,獲取指針p所指對象的值。

003、當指針p的值為對象x的地址時,說p指向x, *p為x的別名。

程序:

#include <stdio.h>

int main(void)
{
    int a = 100;
    int b = 200;
    int c = 500;
    
    int *x, *y;   //指針變量聲明,聲明x、y均為指向int型變量的指針。 
    
    x = &a; y = &c;  //生成指針,x為a的地址,x指向a,y為c的地址,y指向c。 
    
    printf("xxxx:  %d\n", *x);  // 在指針前使用指針運算符,用於獲取指針所指對象的值,x指向a,因此為a的值。 
    printf("yyyy:  %d\n", *y);  //同理,y執行c,因此為c的值。 
    
    x = &b;  //修改指針x,x由 是a的地址改為是b的地址,因此a由指向a該為指向b。 
    *y = 800;  // 指針y是c的地址,y指向c,因此*y是c的別名,對*y重新賦值,相當於對c重新賦值。 
    puts("\n===============\n");
    
    printf("aaaa:  %d\n", a);  //對象a的值 
    printf("bbbb:  %d\n", b);  //對象b的值 
    printf("cccc:  %d\n", c);  //對象c的值,c有c的別名*y重新進行了賦值,c此時為800. 
    printf("xxxx:  %d\n", *x); //x此時是指向b的指針,*x因此是對象b的值 
    printf("yyyy:  %d\n", *y); //*y作為c的別名,進行了重新賦值,值為800. 
    
    return 0;    
} 

 

指針p的值為對象x的地址時,p執行x,*p為x的別名,對別名進行修改,相當於對原始對象的修改。(應用於函數,在形參中反向修改實參?)

 


免責聲明!

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



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