c語言的指針數(shù)組詳解
指針如何指向數(shù)組,并讀取數(shù)組中的元素:
#include <stdio.h> int main() { int arr[3] = {1,2,3}; int *p; p = &arr[0];//此句也可以寫成 p = arr; for(int i=0;i<3;i++) { printf("第%d個(gè)元素值為:%d\n",i,*(p+i)); /*應(yīng)注意這里指針的定義類型;p+i并不是指p的地址+1, 而是偏移一個(gè)類型的字節(jié)數(shù),這里的類型是int,所以偏移4個(gè)字節(jié)*/ } //printf("首元素為:%d\n",*p); return 0; }
指針和數(shù)組更深刻理解
#include <stdio.h> //指針可以當(dāng)數(shù)組名 使用下標(biāo)法 //數(shù)組名也可以像指針一樣拿來加 int main() { int arr[3] = {1,2,3}; int *p = arr; printf("%d ",*p);//這里還可以寫成:printf(“%d “,p[0]);即把指針當(dāng)成所指向的數(shù)組 printf("%d ",p[0]); printf("%d ",*(p+1)); printf("%d ",*(arr+1)); /*上面看出指針跟數(shù)組比較混,區(qū)別在下: 你可以寫*p++,但不能寫*arr++; 因?yàn)椋? p是一個(gè)指針變量,即保存地址的變量 arr可理解為是一個(gè)指針常量 */ putchar('\n'); printf("arr大小:%d\n",sizeof(arr)); printf("p大?。?d\n",sizeof(p));//指針就是地址,地址在os中用8個(gè)字節(jié)表示 printf("int大小:%d\n",sizeof(int)); //上面的比較可以看出數(shù)組與指針的其他區(qū)別 return 0; }
小測(cè)試:使用指針,函數(shù)封裝實(shí)現(xiàn)數(shù)組元素的逆序輸出
#include <stdio.h> //使用指針,函數(shù)封裝實(shí)現(xiàn)數(shù)組元素的逆序輸出 void getarr(int *arr,int *size) { for(int i=0;i<*size;i++) { printf("請(qǐng)輸入第%d個(gè)數(shù):\n",i); scanf("%d",arr++); } } void nixuarr(int *arr,int *size) { int temp,i,j; for(i=0;i<*size/2;i++) { j = *size-1-i; temp = *(arr+i); *(arr+i) = *(arr+j); *(arr+j) = temp; } } void printarr(int *arr,int *size) { for(int i=0;i<*size;i++) { printf("%d ",*(arr+i)); } putchar('\n'); } int main() { int arr[5]; int size; size = sizeof(arr)/sizeof(arr[0]); getarr(&arr[0],&size); printf("逆序前:\n"); printarr(&arr[0],&size); nixuarr(&arr[0],&size); printf("逆序后:\n"); printarr(&arr[0],&size); return 0; }
多維數(shù)組的地址
定義一個(gè)二維數(shù)組int a[3][4]為例,其中a表示二維數(shù)組名,也是整個(gè)數(shù)組首地址;a[0],a[1],a[2]分別表示每個(gè)一維數(shù)組的名,也分別是第0、1、2列元素的地址;也就是說a[0]的值是&a[0][0],a[1]的值是&a[1][0]。其中*a是*(a+0),也就是a[0]。
例:
#include <stdio.h> int main() { int arr[3][4]={{1,2,3,4},{4,5,6,7},{5,6,7,8}}; printf("arr地址:%p,偏移一個(gè)后是%p\n",arr,arr+1);//發(fā)現(xiàn)此句偏移16位 printf("arr[0]地址:%p,偏移一個(gè)后是%p\n",arr[0],arr[0]+1);//此句偏移4位 printf("*(arr+0)地址:%p,偏移一個(gè)后是%p\n",*(arr+0),*(arr+0)+1);//同上一句 return 0; }
#include <stdio.h> int main() { int arr[3][4]={{1,2,3,4},{4,5,6,7},{5,6,7,8}}; int i,j; for(i=0;i<3;i++) { for(j=0;j<4;j++) { printf("地址:%p,值是%d\n",&arr[i][j],arr[i][j]); printf("地址:%p,值是%d\n",arr[i]+j,*(arr[i]+j)); printf("地址:%p,值是%d\n",*(arr+i)+j,*(*(arr+i)+j)); printf("--------------------------------------------------\n"); } } return 0; }
#include <stdio.h> int main() { int arr[3][4]={{1,2,3,4},{4,5,6,7},{5,6,7,8}}; int i,j; int (*p)[4]; p = arr; //上面這種定義叫數(shù)組指針,類似于一維數(shù)組定義一個(gè)*p //這里的數(shù)組指針等同于二維數(shù)組名 for(i=0;i<3;i++) { for(j=0;j<4;j++) { printf("值是%d\n",*(*(p+i)+j)); } } return 0; }
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
C語言文件操作中 fgets與fputs 函數(shù)詳解
這篇文章主要介紹了C語言文件操作中 fgets與fputs 函數(shù)詳解的相關(guān)資料,需要的朋友可以參考下2017-06-06C語言的字符串函數(shù),內(nèi)存函數(shù)筆記詳解
這篇文章主要給大家介紹了關(guān)于C語言字符串/內(nèi)存的相關(guān)函數(shù),文中通過示例代碼總結(jié)的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C語言具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2021-09-09C++中g(shù)etline()、gets()等函數(shù)的用法詳解
這篇文章主要介紹了C++中g(shù)etline()、gets()等函數(shù)的用法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-02北郵計(jì)算機(jī)考研復(fù)試題的C語言解答精選
這篇文章主要介紹了北郵計(jì)算機(jī)考研復(fù)試題目的C語言解答精選,選自2012年的一些基礎(chǔ)的上機(jī)題目,需要的朋友可以參考下2015-08-08C語言?詳解如何刪除有序數(shù)組中的重復(fù)項(xiàng)
數(shù)組不擅長(zhǎng)插入(添加)和刪除元素。數(shù)組的優(yōu)點(diǎn)在于它是連續(xù)的,所以查找數(shù)據(jù)速度很快。但這也是它的一個(gè)缺點(diǎn)。正因?yàn)樗沁B續(xù)的,所以當(dāng)插入一個(gè)元素時(shí),插入點(diǎn)后所有的元素全部都要向后移;而刪除一個(gè)元素時(shí),刪除點(diǎn)后所有的元素全部都要向前移2022-03-03