指针,c语言的灵魂
指針是一個(gè)值為內(nèi)存地址的變量。
變量是一塊內(nèi)存空間,指針是變量,是用來(lái)存儲(chǔ)內(nèi)存地址的變量。
#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; }根據(jù)地址,找到空間!然后操作空間!
變量地址也占用空間,只不過(guò)占用的不是內(nèi)存空間,而是寄存器的存儲(chǔ)空間。
內(nèi)存地址實(shí)際上是一種偏移量,存儲(chǔ)于段寄存器中。內(nèi)存地址只是一種抽象,不是真正的物理內(nèi)存地址,而是邏輯地址。由邏輯地址尋找到物理地址需要經(jīng)過(guò) 邏輯地址->線性地址->物理地址 轉(zhuǎn)換過(guò)程,而這些過(guò)程都是基于寄存器完成的。
#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; }指針的類(lèi)型,跟他所指向的數(shù)據(jù)結(jié)構(gòu)有關(guān)。
基本類(lèi)型的指針指向基本類(lèi)型的數(shù)據(jù)結(jié)構(gòu)。
比如:char * p; int p; float p; double *p;
分別指向的是char, int ,float, double 類(lèi)型的變量。
一個(gè)變量就是一個(gè)內(nèi)存空間,內(nèi)存一定是有物理地址的!指針就是保存變量?jī)?nèi)存物理地址的變量!
指針與數(shù)組
數(shù)組是一個(gè)連續(xù)的內(nèi)存空間,數(shù)組名就是它的首地址。
#include <stdio.h> #include <stdlib.h>int main() {double score[] = {98,87,65,43,76};printf("數(shù)組的首地址:%p\t 數(shù)組手元素的地址 :%p\n",score,&score[0]);}數(shù)組名就是數(shù)組元素的首地址。
#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++); // 通過(guò)首地址取找數(shù)組元素的值}for (i=0;i<5;i++) {printf("%.2lf\n",score[i]);}}等價(jià)的!double類(lèi)型的數(shù)據(jù),每個(gè)數(shù)據(jù)移動(dòng)了8個(gè)字節(jié)。物理地址是一個(gè)十六進(jìn)制的數(shù)字。
#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個(gè)元素的值為%d,地址為%p\n",i,*ptr_array,ptr_array);ptr_array ++ ;}/*第0個(gè)元素的值為15,地址為0028FF0C第1個(gè)元素的值為20,地址為0028FF10第2個(gè)元素的值為25,地址為0028FF14第3個(gè)元素的值為30,地址為0028FF18第4個(gè)元素的值為35,地址為0028FF1C*/return 0; }int型地址間隔4個(gè)字節(jié)。
#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;// 實(shí)現(xiàn)數(shù)組的逆序// 數(shù)組的首尾元素進(jìn)行交換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; }逆序數(shù)組,找規(guī)律是寫(xiě)程序必備的技能!
#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];// 實(shí)現(xiàn)數(shù)組的逆序// 數(shù)組的首尾元素進(jìn)行交換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; }指針實(shí)現(xiàn)數(shù)組逆序!
二維數(shù)組與指針
首地址
&a[0][0]有祥有略!有精有簡(jiǎn)!有的放矢有的取舍去學(xué)習(xí)!
何為二維數(shù)組,如何理解?由n個(gè)一維數(shù)組組成!
#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}};// 傳統(tǒng)的訪問(wèn)方式for (i = 0;i < 5;i++) {for (j = 0;j <3 ;j++) {printf("%.2lf\t",score[i][j]);}printf("\n");}printf("=================================\n");// 指針的方式訪問(wè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) 獲取二維數(shù)組的公式!
老九語(yǔ)錄,會(huì)賦值,會(huì)打印就差不多了!多練習(xí)練習(xí)再做個(gè)小項(xiàng)目就可以了!
總結(jié)
- 上一篇: 第八章习题答案
- 下一篇: elasticsearch 二、elas