C語言入門(十七)之指標的基本概念
阿新 • • 發佈:2018-11-05
如何定義指標變數
普通變數:
資料型別 變數名稱;
指標變數:
資料型別 * 變數名稱;
資料型別 : 說明將來指標變數能夠儲存什麼型別的變數的地址
注意: 指標變數是什麼型別, 那麼將來就只能儲存什麼型別變數的地址,
例如: 指標變數是int型別, 那麼將來就只能儲存int型別變數的地址
* : 沒有任何特殊含義, 僅僅是為了標示這是一個指標變數
變數名稱 : 用於區分不同的變數
int num; // 普通變數 num = 10; int *p; // 指標 , 在64位編譯器下佔用8個位元組 // 千萬注意: 指標變數只能儲存地址 p = # // 將num的地址儲存到p這個指標中 // p == &num printf("num = %p\n", &num); printf("p = %p\n", p); // 指標變數前的*號代表訪問指標變數指向的那一塊儲存空間 // *p == num *p = 55; printf("num = %i\n", *p);
/ 指標就是專門用於儲存地址的
void change3(int *p) // 用什麼接收地址? 指標 = 0ffc13 int *p = #
{
*p = 55;
printf("哥被執行了\n");
}
1、交換兩個變數的值
#include <stdio.h> void swap(int *v1, int *v2) // int *v1 = &a, int *v2 = &b; v1 = 0ffc13 v2 = 0ffc9 // *v1 == a *v2 == b { int temp = *v1; // int temp = 0ffc13 *v1 = *v2; *v2 = temp; } int main(int argc, const char * argv[]) { // 定義一個函式交換兩個變數的值 int a = 10; // 0ffc13 int b = 5; // offc9 printf("交換前:a = %i, b = %i\n", a, b); // int temp = a; // a = b; // b = temp; swap(&a, &b); printf("交換後:a = %i, b = %i\n", a, b); return 0; }
2、定義一個函式, 傳遞三個值, 返回這三個值得和,差,平局值
#include <stdio.h>
//int demo(int v1, int v2, int v3);
int demo(int v1, int v2, int v3, int *p1, int *p2);
int main(int argc, const char * argv[]) {
// 要求定義一個函式, 傳遞三個值, 返回這三個值得和,差,平局值
int a = 10;
int b = 20;
int c = 30;
// int res = demo(a , b , c);
// printf("res = %i\n", res);
// 定義三個變數用於儲存計算結果
int res1 = 0; // 和
int res2 = 0; // 差
// int res3 = 0; // 平局值
// *p1 == res1 *p2 == res2
// 我們想要的就是呼叫完函式之後, 和差平均值對應的變數都被"修改"為對應的值
int res3 = demo(a, b, c, &res1, &res2);
printf("和 = %i, 差 = %i, 平均值 = %i\n", res1, res2, res3);
return 0;
}
int demo(int v1, int v2, int v3, int *p1, int *p2)
{
int sum = v1 + v2 + v3;
*p1 = sum;
int m = v1 - v2 - v3;
*p2 = m;
int average = sum / 3;
return average;
/*
// 因為返回的是一個逗號表示式, 而逗號表示式的值是最後一個表示式的值, 所有返回的是average
// return sum, m, average;
*/
/*
// return 連個作用 1.返回值給呼叫者 2.結束函式
// 注意點: return後面不可以寫任何語句, 因為執行不到
return sum;
printf("--------------\n");
return m;
return average;
*/
}
指標注意點
指標的指向可以修改
int a = 10;
int b = 5;
int *p = &a;
*p = 88;
p = &b;
*p = 44;
printf("%i\n", a);
printf("%i\n", b);
指標型別是什麼型別, 就只能指向什麼型別的資料
多級指標
指向指標地址的指標,儲存的是指標的地址。
指標為什麼分型別
因為當我們利用指標去取值的時候, 系統就會自動根據指標的型別來確定應該取對少個位元組中的值
mac(64位)系統上,指標無論什麼型別,都佔8個位元組,因為
64=8*8
/*
char *cp;
int *ip;
double *dp;
double **dpp;
// mac系統中的指標無論是什麼型別, 幾級真正都佔用8個位元組
// 由於Mac是64位了, 32 = 4 * 8; 64 = 8 * 8;
printf("cp = %lu, ip = %lu, dp = %lu, dpp = %lu\n", sizeof(cp), sizeof(ip), sizeof(dp), sizeof(dpp));
*/
// 指標為什麼要分型別?
// 因為當我們利用指標去取值的時候, 系統就會自動根據指標的型別來確定應該取對少個位元組中的值