指针,c语言的灵魂
指針是一個值為內存地址的變量。
變量是一塊內存空間,指針是變量,是用來存儲內存地址的變量。
#include <stdio.h> #include <stdlib.h>int main() {int num = 9;printf("num變量的地址為:%p\n",&num); // p表示指針占位符return 0; } #include <stdio.h> #include <stdlib.h>int main() {int num = 9;int * ptr_num = #printf("num變量的地址為:%p\n",ptr_num); // p表示指針占位符return 0; }根據地址,找到空間!然后操作空間!
變量地址也占用空間,只不過占用的不是內存空間,而是寄存器的存儲空間。
內存地址實際上是一種偏移量,存儲于段寄存器中。內存地址只是一種抽象,不是真正的物理內存地址,而是邏輯地址。由邏輯地址尋找到物理地址需要經過 邏輯地址->線性地址->物理地址 轉換過程,而這些過程都是基于寄存器完成的。
#include <stdio.h> #include <stdlib.h>int main() {int num = 9;int * ptr_num = #* ptr_num = 10;printf("* ptr_num的值為:%d\n",* ptr_num);printf("num的值為:%d\n",num); // p表示指針占位符return 0; }指針的類型,跟他所指向的數據結構有關。
基本類型的指針指向基本類型的數據結構。
比如:char * p; int p; float p; double *p;
分別指向的是char, int ,float, double 類型的變量。
一個變量就是一個內存空間,內存一定是有物理地址的!指針就是保存變量內存物理地址的變量!
指針與數組
數組是一個連續的內存空間,數組名就是它的首地址。
#include <stdio.h> #include <stdlib.h>int main() {double score[] = {98,87,65,43,76};printf("數組的首地址:%p\t 數組手元素的地址 :%p\n",score,&score[0]);}數組名就是數組元素的首地址。
#include <stdio.h> #include <stdlib.h>int main() {int i;double score[5] = {98,87,65,43,76};double * ptr_score;ptr_score = score;for (i=0;i<5;i++) {printf("%.2lf\n",*ptr_score++); // 通過首地址取找數組元素的值}for (i=0;i<5;i++) {printf("%.2lf\n",score[i]);}}等價的!double類型的數據,每個數據移動了8個字節。物理地址是一個十六進制的數字。
#include <stdio.h> #include <stdlib.h>int main() {int array[] = {15,20,25,30,35};int i;int * ptr_array = array;for (i = 0;i<5;i++) {printf("第%d個元素的值為%d,地址為%p\n",i,*ptr_array,ptr_array);ptr_array ++ ;}/*第0個元素的值為15,地址為0028FF0C第1個元素的值為20,地址為0028FF10第2個元素的值為25,地址為0028FF14第3個元素的值為30,地址為0028FF18第4個元素的值為35,地址為0028FF1C*/return 0; }int型地址間隔4個字節。
#include <stdio.h> #include <stdlib.h> #include <math.h> #define N 7int main() {int array[N] = {15,20,25,30,35,40,90};int i;int temp;// 實現數組的逆序// 數組的首尾元素進行交換for (i = 0;i<floor(N/2);i++) {temp = array[i];array[i] = array[N-i-1];array[N-i-1] = temp;}for (i = 0;i<N;i++) {printf("交換后第%d元素的值為:%d\n",i,*(array + i));}return 0; }逆序數組,找規律是寫程序必備的技能!
#include <stdio.h> #include <stdlib.h> #include <math.h> #define N 7int main() {int array[N] = {15,20,25,30,35,40,90};int i;int temp;int * ptr_head;int * ptr_foot;ptr_head = &array[0];ptr_foot = &array[N-1];// 實現數組的逆序// 數組的首尾元素進行交換for (i = 0;i<floor(N/2);i++) {temp = * ptr_head;* ptr_head = * ptr_foot;* ptr_foot = temp;ptr_head ++;ptr_foot --;}for (i = 0;i<N;i++) {printf("交換后第%d元素的值為:%d\n",i,*(array + i));}return 0; }指針實現數組逆序!
二維數組與指針
首地址
&a[0][0]有祥有略!有精有簡!有的放矢有的取舍去學習!
何為二維數組,如何理解?由n個一維數組組成!
#include <stdio.h> #include <stdlib.h> #include <math.h>int main() {int i,j;double score[5][3] = {{55,56,57},{58,59,60},{61,62,63},{64,65,66},{67,68,69}};// 傳統的訪問方式for (i = 0;i < 5;i++) {for (j = 0;j <3 ;j++) {printf("%.2lf\t",score[i][j]);}printf("\n");}printf("=================================\n");// 指針的方式訪問for (i = 0;i < 5;i++) {for (j = 0;j <3 ;j++) {// printf("%.2lf\t",*(score[i] + j));printf("%.2lf\t",*(*(score+i) + j));}printf("\n");}return 0; }*(*(score + i) + j) 獲取二維數組的公式!
老九語錄,會賦值,會打印就差不多了!多練習練習再做個小項目就可以了!
總結
- 上一篇: 第八章习题答案
- 下一篇: elasticsearch 二、elas