指針:
- 指針就是地址,地址就是指針。
- 地址就是內存單元的編號。
- 指針變量是存放地址的變量(例:int* p,這裏的p就是指針變量,用於存放地址)
指針和指針變量是兩個不同的概念:平時也把指針變量間讀爲指針,也就是說下面示例代碼中的p既是我們所說的指針,也是我們所說的指針變量。
例:
- 指針裏面存放的是100:這句話中,指針就是地址
- 指針裏面存放的是地址:這句話中,指針就是指針變量
爲什麼使用指針:
- 指針能直接訪問硬件(OpenGL顯卡繪圖)
- 快速傳遞數據(指針表示地址:如change_numbers方法調用,調用方法change_numbers函數的時候傳入值進去,無法改變main方法中變量的真實值,只有傳入地址(也就是指針)才能真正改變main函數中的變量的值)
- 返回一個以上的值(返回一個數組或者結構體的指針)
- 表示複雜的數據結構
- 方便處理字符串
- 有點像面向對象
示例代碼:
#include <stdio.h>
void pointertest();
void change_numbers(int a, int b);
void main()
{
int a = 100;
int b = 200;
change_numbers(a, b);//這裏傳的是int類型的變量值,操作的是change_numbers函數中衛形參開闢出來的地址,不能真實的改變main方法中的a,b的值。
printf("a = %d \nb = %d \n", a, b);
change_numbers2(&a, &b);//這樣就是直接把a,b在main方法中開闢的地址傳過去,是直接操作main函數中a,b所在的地址,能直接改變main函數中a,b的值。
int i = 10;
int* p; //指針的聲明,這時候會開闢出一塊內存,也就是一個地址,但是這塊內存中沒有存放東西(int*類型)
//C語言中沒有String類型,可用指針返回一個字符串
char* h = "Hello World !";
printf("array : %s\n", h);
p = &i;//指針的初始化,爲上面開闢出來的內存進行賦值,指向了i這個整數所在的地址
printf("*p = %d \n", *p);
*p = 100;//這裏的p就是指針(int*類型)(其實它叫指針變量,只是平時我們 習慣性叫它指針),*p指的是p指向的地址中的值(int類型)
printf("更改*p的值!\n");
printf("*p = %d \n", *p);
printf("i = %d \n", i);
printf("修改i的值!\n");
i = 50;
printf("*p = %d \n", *p);
printf("i = %d \n", i);
}
void change_numbers(int a, int b)
{
int temp;
temp = a;
a = b;
b = temp;
}
void change_numbers2(int* a, int* b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
運行結果: