指針
一、指針的基本概念
所謂指針是一個用來指示一個內存地址的計算機語言的變量或中央處理器中的寄存器。通俗地講,在把一個變量所在的內存單位的地址保存在另外一個內存單元中,保存地址的這個內存單元成爲指針。
例:
int i;
int *pi=&i;
char c;
char *pc=&c;
這裏的&是取地址運算符,&i表示取變量i的地址,int *pi=&i;表示定義一個指向int型的指針變量pi,並用i的地址來初始化pi;這裏的*號是指針間接尋址運算符,*pi表示取指針pi所指向的變量的值,也稱爲Dereference操作,指針有時稱爲變量的引用,所以根據指針找到變量稱爲Dereference。指針之間可以相互賦值,也可以用一個指針初始化另一個指針。
二、指針類型的參數和返回值
例:
#include "stdafx.h"
int *swap(int *px,int *py)
{
int temp;
temp=*px;
*px=*py;
*py=temp;
return px;
}
int _tmain(int argc, _TCHAR* argv[])
{
int i=10,j=20;
int *p=swap(&i,&j);
printf("now i=%d j=%d *p=%d\n",i,j,*p);
getchar();
return 0;
}
通常函數的參數是單向值傳遞,即函數本身並不能改變實參的值,但是如果函數的參數是通過指針、引用或數組的方式進行傳遞的,那麼就可以通過函數改變實參的值。
三、指向指針的指針與指針數組
數組中的每個元素可以是基本類型,也可以複合類型,因此也可以是指針類型。
例:
int *a[10]; 這稱爲指針數組。
例:打印命令參數
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
int i;
for(i=0;i<argc;i++)
{
printf("argv[%d]=%s\n",i,argv[i]);
}
getchar();
return 0;
}
說明:第7~10行通過命令行給main函數傳遞參數時,所傳遞的參數的個數將存儲到變量argc中,而相關的參數則存儲到字符串數組argv[ ]中。
四、指向數組的指針與多維數組
使用方法:
int a[10];
int (*pa)[10]=&a;
說明:a是一個數組,在&a這個表達式中,數組名做左值,取整個數組的首地址賦給指針pa。
五、函數類型和函數指針類型
在C語言中,函數也是一種類型,可以定義指向函數的指針。我們知道,指針變量的內存單元放一個地址值,而函數指針存放的就是函數的入口地址。
例:函數指針
#include "stdafx.h"
void say_hello(const char *str)
{
printf("Hello%s\n",str);
}
int main()
{
void(*f)(const char *)=say_hello;
f("Guys");
getchar();
return 0;
}
說明:函數調用運算符()要求操作數是函數指針,所以f(“Guys”)是直接的寫法,而say_hello("Guys")或(*f)("Guys")則是把函數類型自動轉化成函數指針。然後做函數調用。