C语言指针详解(通俗易懂)
前言
剛開(kāi)始接觸C語(yǔ)言,對(duì)C語(yǔ)言中的指針有一點(diǎn)不能理解,接著還有一個(gè)"&"符號(hào)感覺(jué)兩者有點(diǎn)接近和混淆。兩者的定義如下:
- &是取地址符號(hào)
- *是定義指針變量,即指向內(nèi)存單元的指針
指針是C/C++語(yǔ)言的特色,它允許程序員直接操縱內(nèi)存,所以說(shuō)C語(yǔ)言是一種高效的語(yǔ)言。很多語(yǔ)言屏蔽了編程人員直接操縱內(nèi)存的權(quán)限去降低軟件開(kāi)發(fā)的難度。
&
#include<stdio.h> int main() {int a=20;printf("a 的值為%d\n",a);printf("a 的地址為%d\n",&a);return 0; } //打印結(jié)果: a 的值為20 a 的地址為1703740(1703740為a地址0019FF3C的十進(jìn)制)& 符號(hào)的作用很清晰, &a就是取變量a的地址。
*
#include<stdio.h> int main() {int a=20;int *ip;ip=a;printf("ip 的值為%d\n",ip);printf("*ip 的值為%d\n",*ip);return 0; } //打印結(jié)果: ip 的值為20為什么只打印了一個(gè)值呢?剛開(kāi)始學(xué)習(xí)不是很懂,回去查指針變量的定義,再加上網(wǎng)上查閱各種資料,定義說(shuō):*表示一個(gè)指針變量,指向內(nèi)存單元,指向內(nèi)存單元,應(yīng)該就是地址吧,那么ip變量應(yīng)該被賦值一個(gè)地址,前邊說(shuō)的 & 不就表示一個(gè)地址嗎,試一下
#include <stdio.h>int main () {int a=5;int *b;b=&a;printf("a 的值為 %d\n",a);printf("&a 的值為 %d\n",&a);printf("b的值為%d\n",b);printf("*b 的值為 %d\n",*b); } //打印結(jié)果: a 的值為 5 &a 的值為 1703740 b的值為1703740 *b 的值為 5定義變量時(shí)int* a;int* 表示取指針,在地址前加*表示這個(gè)地址的內(nèi)容。
函數(shù)指針和指針函數(shù)
函數(shù)指針的定義:
returnType (*pointerName)(param list);
指針函數(shù)的定義:
returnType *pointerName(paramlist);
returnType 為函數(shù)返回值類型,pointerNmae 為指針名稱,param list 為函數(shù)參數(shù)列表,函數(shù)指針賦值為函數(shù)地址。注意:( )的優(yōu)先級(jí)高于*,第一個(gè)括號(hào)不能省略,如果寫(xiě)作returnType *pointerName(paramlist);就成了函數(shù)原型(指針函數(shù)),它表明函數(shù)的返回值類型為returnType *,返回值類型為1個(gè)指針。
調(diào)用函數(shù)直接調(diào)用就好了,為什么還要定義一個(gè)函數(shù)指針呢,才接觸時(shí)很不理解,后了解到由于函數(shù)指針存儲(chǔ)的是一個(gè)內(nèi)存地址,在傳參的時(shí)候傳入一個(gè)地址比傳入一個(gè)地址對(duì)應(yīng)的函數(shù)名更高效,運(yùn)算速度更快。
數(shù)組指針
數(shù)組是一種結(jié)構(gòu)類型,在某種意義上來(lái)說(shuō)數(shù)組名就是指針,可以轉(zhuǎn)化為指向其實(shí)體的指針,指針則是變量,僅僅意味著數(shù)組的存放地址,數(shù)組名概念比較寬泛,也更加復(fù)雜,而指針僅僅代表數(shù)組的首地址
#include <stdio.h>int main() {int a[]={1,2,3,4,5};int *p=a;printf("數(shù)組a首地址%d\n",&a);//數(shù)組a首地址1703724printf("數(shù)組a首地址%d\n",p);//數(shù)組a首地址1703724printf("a所占空間%d\n",sizeof(a));//a所占空間20(a代表整個(gè)數(shù)組,大小為4*5=20)printf("*p所占內(nèi)存空間%d\n",sizeof(p));//*p所占內(nèi)存空間4(*p僅僅指向首地址)printf("*p指向地址的內(nèi)容%d\n",*p);//*p指向地址的內(nèi)容1return 0;}指向指針的指針
#include<stdio.h> #include<stdlib.h>int main(){char *s[]={"aaa","bbb","ccc","ddd"};char **p;//定義指向指針的指針int k;for(k=0;k<4;k++){p=&s[k];//指針賦值為地址 如果不加則為s[k]的內(nèi)容,會(huì)出錯(cuò)printf("%s\n",*p);//使用*p訪問(wèn)指針?biāo)赶虻刂返膬?nèi)容}return 0;}總結(jié)
總結(jié)
以上是生活随笔為你收集整理的C语言指针详解(通俗易懂)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: yii源码学习心得
- 下一篇: cfg桩设备型号_什么是CFG桩?带您看