1、指向指針的指針
指針變量可以指向整型變量、實型變量、字符類型數據,也可以指向指針類型變量。稱之爲指向指針的指針變量
定義如下:
類型標識符 **指針變量名;
例如:
int **p;
其含義爲定義一個指針變量p,它指向另一個指針變量,該指針變量又指向有個基本整型變量。由於基本指針運算符*是自右向左結合的,所以上述的定義和下面一樣
int *(*p);
整型變量i的地址是&i,將其值傳遞給指針變量p1,則p1指向i;同時,將p1的地址&p1傳遞給p2,則p2指向p1。p2就是指向指針變量的指針。下圖表現更形象。
例子如下:
#include<stdio.h>
int main()
{
int i;
char **p;
char *number[]=
{
"one",
"two",
"three",
"four"
};
for(i=0;i<4;i++)
{
p=number+i;
printf("%s\n",*p);
}
}
2、指針變量作函數參數
指針變量也可以作爲函數的參數,例如下例,利用指針函數做交換函數的參數
在本例中自定有swap交換函數,在主函數中調用交換函數,交換函數的兩個形參被傳輸兩個地址值,也就是傳入了兩個指針變量,在交換函數內部使用整型變量temp作中間變量。將兩個指針所指向的數值進行交換。
#include<stdio.h>
#include<stdlib.h>
void swap(int *a,int *b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
int main()
{
int x, y;
printf("please input two numbers:\n");
scanf("%d", &x);
scanf("%d", &y);
swap(&x, &y);
printf("x=%d\n", x);
printf("y=%d\n", y);
system("pause");
}
結果如圖
如果將函數更改成如下函數,結果就會如下面圖片所示,並沒有交換數值,這裏涉及到了函數傳值。
在函數調用過程中,主函數與調用函數之間存在一個數值傳遞的過程,函數調用中發生的數值傳遞是單向的,就是隻能把實參傳遞給形參,在函數調用的過程中,形參的值發生改變,但是實參的值是不會發生改變的,因此下面這段代碼並不會實現數值交換。
通過指針傳遞參數可以減少傳遞帶來的開銷,也可以使函數調用不產生值傳遞。
#include<stdio.h>
#include<stdlib.h>
void swap(int a,int b)
{
int temp;
temp = a;
a = b;
b = temp;
}
int main()
{
int x, y;
printf("please input two numbers:\n");
scanf("%d", &x);
scanf("%d", &y);
swap(x, y);
printf("x=%d\n", x);
printf("y=%d\n", y);
system("pause");
}
結果如下: