1. 程式人生 > >C語言中指標變數作為函式引數和一般變數作為函式引數的區別

C語言中指標變數作為函式引數和一般變數作為函式引數的區別

函式的引數不僅可以是整型、浮點型、字元型等資料,還可以是指標型別。它的作用是將一個變數的地址傳送到另一個函式中。

指標變數作為函式引數和一般變數作為函式引數是有區別的,對於這種區別初學者一般都很迷惑。下面我將就一個簡單的例子來說明一下它們的區別。看透以後也許也就不那麼疑惑了。

# include <stdio.h>
void main()
{
 void swap1(int a,int b);
 void swap2(int *p1,int *p2);
 int *p1,*p2,*p,a,b;
 scanf("%d,%d",&a,&b);
 p1=&a;p2=&b;
 if(a<b)
 {
  p=p1;
  p1=p2;
  p2=p;
 }
 printf("a=%d,b=%d/n/n",a,b);
 printf("max=%d,min=%d/n",*p1,*p2);
 if(a<b)
 {
  int *addra=&a; //a的地址&a=0x0012ff70


  int *addrb=&b; //b的地址&b=0x0012ff6c
  swap1(a,b);
 }
    printf("swap1 a=%d,b=%d/n/n",a,b);
 if(a<b)
 {
  swap2(&a,&b);
 }
 printf("swap2 a=%d,b=%d/n/n",a,b);
}
void swap1(int a,int b)
{
 int *addra=&a;  //a的地址&a=0x0012ff10
 int *addrb=&b;  //b的地址&b=0x0012ff14
 int temp;
 temp=a;
 a=b;
 b=temp;
}
void swap2(int *p1,int *p2)
{
 int *addrP1=&(*p1); //*p1的地址和a的地址一樣為0x0012ff70

 int *addrP2=&(*p2); //*p2的地址和b的地址一樣為0x0012ff6c
 int temp;
 temp=*p1;
 *p1=*p2;
 *p2=temp;
}

這是一個簡單的引數傳遞的例子,在VC++6.0中將各個引數的地址調試出來進行比較
1、在swap1函式中引數是簡單的整數型別。可以看到實參的記憶體地址和形參的記憶體地址不一樣也就是說一般的函式引數傳遞是值傳遞,但是在函式呼叫過程中形參重新申請了新的記憶體空間。實參將值傳給了形參。
2、在swap2函式中引數是指標變數,可以看到引數傳遞是值傳遞,實參將地址傳給了形參。實參和形參是同一地址,指向的是同一記憶體空間。

所以指標變數可以實現“通過呼叫函式使變數的值發生變化,在主調函式(如main函式)中可以使用這些改變了的值”的目的。

 補充:
不管是什麼情況在函式呼叫時,將實參變數的值傳給型參變數都是"值傳遞".
如果為了使在函式中改變了的變數值能被main函式所用,不能採取把要改變值的變數作為引數的辦法,而應用指標變數作為函式引數,在函式執行過程中使指標變數所指向的變數值發生變化,函式呼叫結束後,這些變數值的變化依然保留下來。
不能企圖通過改變形參的值而實指標實參的值改變。見以下程式
# include <stdio.h>
void main()
{
 void swap(int * p1,int * p2);
 int a,b;
 int * pointer_1,* pointer_2;
 scanf("%d,%d",&a,&b);
 pointer_1=&a;
 pointer_2=&b;
 if(a<b)
 {
  swap(pointer_1,pointer_2);
 }
 printf("/n%d,%d/n",*pointer_1,*pointer_2);
}

void swap(int * p1,int * p2)
{
 int * p;
 p=p1;
 p1=p2;
 p2=p;
}
結果
輸入1,3
結果1,3

相關推薦

C語言指標變數作為函式引數一般變數作為函式引數區別

函式的引數不僅可以是整型、浮點型、字元型等資料,還可以是指標型別。它的作用是將一個變數的地址傳送到另一個函式中。 指標變數作為函式引數和一般變數作為函式引數是有區別的,對於這種區別初學者一般都很迷惑。下面我將就一個簡單的例子來說明一下它們的區別。看透以後也許也就不那麼疑惑了。

C語言指標變數所佔位元組大小

在學習過程中知道,一個任何型別的指標變數所佔的位元組大小都為4個位元組。這是為什麼呢? 記憶體是由位元組組成的,每個位元組都有一個編號。指標變數主要是存放相同資料型別的變數的首地址。這裡的這個地址其實就是記憶體的某個位元組的編號。而這個編號的確定是與地址匯流排有關。如果地址

c語言指標陣列陣列指標的認識

1.陣列:一批具有同名的同屬性的資料就組成了一個數組。(“[ ]”也是陣列型別的一部分)     由此可知:(1)陣列是一組有序資料的集合;(2)陣列中的每一個元素都屬於同一個資料型別。  定義一維陣列的一般形式:型別符  陣列名【常量表達式】(陣列也

C語言指標的值賦值給陣列

  如果把各種語言做個冷兵器類比的話,C語言一定是刀客的最佳工具.入門很簡單,但是要是能把它熟練運用,那就是頂尖級別的高手了. 用了那麼多年的C語言,發現自己還是僅僅處於熟練的操作工.今天遇到了一個bug,就是和指標的賦值有關係.請看程式碼: 1 #include <stdio.h>

(轉載)C語言常用的幾個標頭檔案及庫函式 (stdio.h ,string.h ,math.h ,stdlib.h)

不完全統計,C語言標準庫中的標頭檔案有15個之多,所以我主要介紹常用的這四個標頭檔案stdio.h ,string.h ,math.h ,stdlib.h ,以後用到其他的再做補充。下面上乾貨: 1.<stdio.h>:定義了輸入輸出函式、型別以及巨集,函式

C語言指標指標陣列的理解!

指標就是地址! 概念 C語言中,允許用一個變數來存放地址,這種變數稱為指標變數。一個指標變數的值就是某個記憶體單元的地址。指標變數就是用來存放指標(地址)的變數! &運算子:求某一變數在儲存單元中的記憶體地址。 *運算子:取出指標變數所指向變數的內容,後面

C語言指標陣列的記憶體地址

char arr[3]; printf("arr:\n%d\n%d\n%d\n", arr, arr + 1, arr + 2); char *parr[3]; printf("parr:\n%d\n%d\n%d\n", parr, parr + 1, parr + 2);

C語言指標初始化常規運算

1. 指標初始化注意須知 <1>指標變數和普通變數一樣,外部或者靜態指標變數若未初始化,則被自動初始化為NULL,它的值為0(ASCII字元NULL的程式碼)。 <2>可以

C語言指標傳遞問題

要求:通過呼叫函式實現兩個值的交換 例如:輸入5,9 —– 輸出9,5 不能到達預期的結果的程式碼 #include<stdio.h> void main() { void swap(int *p1, int *p2)

c語言指標加一之後

研究下指標p+1之後,話不多說貼程式碼測試 #include<stdio.h> struct test { int a; int b; char c;

C語言為什麼scanf輸入語句,要在變數名前加&呢?

首先在C語言中,輸入變數的語法是:scanf("格式控制","變數地址") 可以看出,第二個的格式為變數地址。 在C語言中,變數在定義之後,就會在計算機記憶體中非配一塊空間給這個變數,該空間在記憶體中

(轉)使用 CJSON 在C語言進行 JSON 的創建解析的實例講解

orm ret ear bject str 忘記 else aid 百度 使用 CJSON 在C語言中進行 JSON 的創建和解析的實例講解 本文用代碼簡單介紹cjson的使用方法,1)創建json,從json中獲取數據。2)創建json數組和解析json數

C語言關於char型別儲存的分析 以及signed與unsigned的區別

char型別儲存的分析 char和signed char 大家對char型別相信一定不會陌生的ANSI C 提供了3種字元型別,分別是char、signed char、unsigned char

c語言關於srand((unsigned)time(NULL))rand的區別

一直以為rand()直接生成不同的隨機數,實驗結果不對才搜了下原因,轉載分享下... 可以認為rand()在每次被呼叫的時候,它會檢視: 1) 如果使用者在此之前呼叫過srand(seed),給seed指定了一個值,那麼它會自動呼叫 srand(seed)一次來初始

C語言——通過指標如何操作字串——儲存運算

1.兩種字串的引用方式 第一種:定義一個字元陣列,將字串放在字元陣列中。這樣可以通過下標引用法引用字串中的字元,通過陣列名輸出該字串。 #include<stdio.h> int main(void) { char a[]="I lo

c語言浮點運算的infnan錯誤

============================================ 作者:yuanlulu http://blog.csdn.net/yuanlulu 版權沒有,但是轉載請保留此段宣告 ===============================

c語言的二級指標函式引數

1.用指標做函式引數申請動態記憶體的問題 //如果函式引數是指標,不能用一級指標做函式引數實現申請動態記憶體 void getMemory(char *p, int num) { p = (char *)malloc(sizeof(char)*num); } void

C語言如何將陣列作為函式引數傳遞

今天覆習到c語言的陣列,看到這麼一個問題: 現在,你的程式要讀入兩個多項式,然後輸出這兩個多項式的和,也就是把對應的冪上的係數相加然後輸出。 程式要處理的冪最大為100。 輸入格式: 總共要輸入兩個多項式,每個多項式的輸入格式如下: 每行輸入兩個數字,第一個表

C語言變數名及函式名的命名規則與駝峰命名法

一、C語言變數名的命名規則:(可以字母,數字,下劃線混合使用) 1. 只能以字母或下劃線開始;2. 不能以數字開始;3. 一般小寫;4. 關鍵字不允許用(eg:int float=2//error  float 為保留字不允許用); 二、函式名的命名規則 1.見名知意;2.自定義函式函式名首字

C語言函式指標陣列的初始化使用

不比多說上一個程式碼,就懂了! 程式碼一: #include <stdio.h> int func(int i) {     printf("%d\n",i);     return i*i; } int