C指針詳解三

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");
}

結果如下:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章