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的別名,對別名進行修改,相當於對原始對象的修改。(應用於函數,在形參中反向修改實參?)