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