C语言 指针 类型的用法大汇总(指针/引用/取值) *与
今天剛好看匯編需要,就學了學。
本篇文章會不斷完善,有疑問,請在評論區留言
對星號 * 的總結
1.表示乘法,例如int a = 3, b = 5, c; c = a * b;,這是最容易理解的。
2.表示定義一個指針變量,以和普通變量區分開,例如int a = 100; int *p = &a;。
3.表示獲取指針指向的數據,是一種間接操作,例如int a, b, *p = &a; *p = 100; b = *p;。
4.取指針指向的數據。例如: printf(" 內存地址 %p\n", *(p));,printf("當前地址指向的值 %d\n", *(*(p)));
關于 * 和 & 的謎題
假設有一個 int 類型的變量 a,pa 是指向它的指針,那么*&a和&*pa分別是什么意思呢?
&a可以理解為(&a),&a表示取變量 a 的地址(等價于 pa),*(&a)表示取這個地址上的數據(等價于 pa),繞來繞去,又回到了原點,&a仍然等價于 a。
&*pa可以理解為&(*pa),*pa表示取得 pa 指向的數據(等價于 a),&(*pa)表示數據的地址(等價于 &a),所以&*pa等價于 pa。
多級指針 ***p3等價于*(*(*p3))
如果一個指針指向的是另外一個指針,我們就稱它為二級指針,或者指向指針的指針。
int a =100; int *p1 = &a; int **p2 = &p1; #include <stdio.h> int main(){int a =100;int *p1 = &a;int **p2 = &p1;int ***p3 = &p2;printf("%d, %d, %d, %d\n", a, *p1, **p2, ***p3);printf("&p2 = %#X, p3 = %#X\n", &p2, p3);printf("&p1 = %#X, p2 = %#X, *p3 = %#X\n", &p1, p2, *p3);printf(" &a = %#X, p1 = %#X, *p2 = %#X, **p3 = %#X\n", &a, p1, *p2, **p3);return 0; } int (*p)[4] = a;括號中的*表明 p 是一個指針,它指向一個數組,數組的類型為int [4],這正是 a 所包含的每個一維數組的類型。
二維數組的例子:用來學習 *(p+1)和 *(p)+1 的區別
#include "stdafx.h" #include "windows.h" #include "tlhelp32.h" #include <stdio.h> #include "WinDef.h"int main(){int a[3][4] = { {0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11} };int (*p)[4] = a;printf(" 取二維數組的第一行的內存地址 %p\n", *(p));printf(" 取二維數組的第一行的第一個元素 %d\n", *(*(p)+0));printf("取二維數組的第一行的第二個元素 %d\n", *(*(p)+1));printf(" 取二維數組的第二行的內存地址 %p\n", *(p+1));printf(" 取二維數組的第二行的第一個元素 %d\n", *(*(p+1)+0));printf("取二維數組的第二行的第二個元素 %d\n", *(*(p+1)+1));return 0; }*(p+1)+1表示第 1 行第 1 個元素的地址。如何理解呢?
*(p+1)單獨使用時表示的是第 1 行數據,放在表達式中會被轉換為第 1 行數據的首地址,也就是第 1 行第 0 個元素的地址,因為使用整行數據沒有實際的含義,編譯器遇到這種情況都會轉換為指向該行第 0 個元素的指針;就像一維數組的名字,在定義時或者和 sizeof、& 一起使用時才表示整個數組,出現在表達式中就會被轉換為指向數組第 0 個元素的指針。
*(*(p+1)+1)表示第 1 行第 1 個元素的值。很明顯,增加一個 * 表示取地址上的數據。
根據上面的結論,可以很容易推出以下的等價關系:
a+i == p+i
a[i] == p[i] == *(a+i) == *(p+i)
a[i][j] == p[i][j] == *(a[i]+j) == *(p[i]+j) == ((a+i)+j) == ((p+i)+j)
結構體待議
#include "stdafx.h" #include "windows.h" #include "tlhelp32.h" #include <stdio.h> #include "WinDef.h"int main(){struct{char *name; //姓名int num; //學號int age; //年齡char group; //所在小組float score; //成績} stu1;//給結構體成員賦值stu1.name = "Tom";stu1.num = 12;stu1.age = 18;stu1.group = 'A';stu1.score = 136.5;//讀取結構體成員的值printf("%s的學號是%d,年齡是%d,在%c組,今年的成績是%.1f!\n", stu1.name, stu1.num, stu1.age, stu1.group, stu1.score);return 0;總結
以上是生活随笔為你收集整理的C语言 指针 类型的用法大汇总(指针/引用/取值) *与的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 学习汇编图文. 寄存器的特殊用法
- 下一篇: Js中 call() 与 apply()