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