wordpress 流媒體seo關(guān)鍵詞排名優(yōu)
數(shù)組指針(一維數(shù)組)
數(shù)組指針就是"?數(shù)組的指針 ",它是一個(gè)指向數(shù)組首地址的指針變量。
1、數(shù)組名的含義
對(duì)于一維數(shù)組,數(shù)組名就是一個(gè)指針,指向數(shù)組的首地址。
基于如下代碼進(jìn)行分析:
int a[5] = {1,2,3,4,5};
int* p = a;
- a是數(shù)組a[5]的數(shù)組名,在這里a是個(gè)常量,一定指向的是a[5]的首地址,不能進(jìn)行" ++ "改值運(yùn)算。
- p是一個(gè)指針變量,它指向了a[5]的首地址,所以它是一個(gè)數(shù)組指針。在這里p是一個(gè)變量,可以進(jìn)行" ++ "改值運(yùn)算
2、數(shù)組名索引與指針?biāo)饕?/h3>
當(dāng)我們想要訪問1這個(gè)值的時(shí)候,可以有a[0]、*(a+0)、*(p+0)、p[0] 這四種訪問形式。
- a[0]:基本的下標(biāo)法訪問
- *(a+0):a可以看作首地址,偏移量為數(shù)組的類型int大小,找到地址后解引用也可訪問1這個(gè)值
- *(p+0):p保存了數(shù)組首地址,偏移量為int大小,通過解引用訪問地址
- p[0]:特殊,記住即可
注意:*(p+0)、p[0]這兩種方法是指針偏移的方法,它實(shí)際表示的值與p指向的位置有關(guān)。比如p指向的是a[1]這個(gè)位置,那么*(p+0)、p[0]訪問的不是a[0]而是a[1],而*(p-1)、p[-1]訪問的才是a[0]。
3、數(shù)組名與數(shù)組元素取地址
數(shù)組名a與數(shù)組元素取地址&a[ i ]它們的值一樣,偏移量也一樣。但數(shù)組名表示整個(gè)數(shù)組,數(shù)組元素取地址僅僅是一個(gè)指針。下面分析" a、&a[0]區(qū)別 "、" a+1、&a[0]+1 區(qū)別"
a、&a[0]的相同點(diǎn):
- 地址值相同、偏移量也相同。
- 都是常量,都不能進(jìn)行++等變值操作。
a、&a[0]的不同點(diǎn):
- a不僅僅指向數(shù)組首地址,還可以代表數(shù)組;
- &a[0]只是一個(gè)指針,什么都不代表。
4、&a是什么
一維數(shù)組可以看成列指針,取地址之后變?yōu)樾兄羔槨?/p>
&a的作用與二維數(shù)組名類似:a看成列指針,偏移一個(gè)數(shù)據(jù)元素,&a看成行指針偏移一行。
數(shù)組指針(二維數(shù)組)
1、一維指針遍歷二維數(shù)組
由于二維數(shù)組的元素在內(nèi)存中是按行序進(jìn)行排列的,內(nèi)存排列依舊是連續(xù)的。所以在內(nèi)存方面,它與一維數(shù)組沒有任何區(qū)別,具體的二維數(shù)組內(nèi)存分配如下:
遍歷的代碼如下:
#include <stdio.h>/* 計(jì)算二維數(shù)組總大小 */
#define ARRAY2_SIZE(array,type) sizeof(array)/sizeof(type)
/* 計(jì)算二維數(shù)組中一維數(shù)組大小(列大小) */
#define ARRAY2_COL_SIZE(array) sizeof(array[0])
/* 計(jì)算二維數(shù)組的列數(shù) */
#define ARRAY2_COL_NUM(array,type) ARRAY2_COL_SIZE(array)/sizeof(type)
/* 計(jì)算二維數(shù)組的行數(shù) */
#define ARRAY2_ROW_NUM(array,type) sizeof(array)/ARRAY2_COL_SIZE(array)int main(){int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};int *p = NULL; int col,row;int i;col = ARRAY2_COL_NUM(a,int);row = ARRAY2_ROW_NUM(a,int);p = &a[0][0];//注意這里的賦值,p賦值的是a[0][0]的地址,而不是直接賦值數(shù)組名a for(i=0;i<row*col;i++){printf("%d %d\n",*(p+i),p[i]);} return 0;
}
上述代碼有一個(gè)注意點(diǎn),p=&a[0][0]而不是p=a。在二維數(shù)組中,盡管&a[0][0]的值與a相同,都是指向數(shù)組首地址,但是它們的偏移量不同。
2、二維數(shù)組的數(shù)組指針
二維數(shù)組名是一個(gè)指向二維數(shù)組的首地址的常量。它是一個(gè)代表二維數(shù)組,偏移量以行為單位。例如:int a[2][3]它每3列為一行,假設(shè)首地址為0x00,那么a+1 = 0x00 + sizeof(int) * 3。
指向二維數(shù)組的數(shù)組指針被稱為"?行指針 "。它的定義形式為:<數(shù)據(jù)類型>(*變量名)[列數(shù)],如上述的int a[2][3],它的數(shù)組指針為:int (*p)[3] = a。
3、二維數(shù)組元素分析
二維數(shù)組可以看成兩部分組成:二維數(shù)組由多個(gè)一維數(shù)組組成,一維數(shù)組由多個(gè)數(shù)據(jù)組成。
所以二維數(shù)組名解引用之后得到的是一維數(shù)組名,一維數(shù)組名解引用后得到的是數(shù)據(jù)元素。
即:*a+i = a[i],&a[0] = a
a 與 &a[0] 的區(qū)別
相同點(diǎn):
- 地址值一樣,偏移量一樣。
- 都是常量,都不能進(jìn)行++等變值操作。
不同點(diǎn):
- a不僅僅指向數(shù)組首地址,還可以代表數(shù)組;
- &a[0]只是一個(gè)指針,sizeof(&a[0])返回的是指針大小,而不是二維數(shù)組大小
下面是用二維數(shù)組的數(shù)組指針來遍歷的代碼:
#include <stdio.h>
/* 計(jì)算二維數(shù)組總大小 */
#define ARRAY2_SIZE(array,type) sizeof(array)/sizeof(type)
/* 計(jì)算二維數(shù)組中一維數(shù)組大小(列大小) */
#define ARRAY2_COL_SIZE(array) sizeof(array[0])
/* 計(jì)算二維數(shù)組的列數(shù) */
#define ARRAY2_COL_NUM(array,type) ARRAY2_COL_SIZE(array)/sizeof(type)
/* 計(jì)算二維數(shù)組的行數(shù) */
#define ARRAY2_ROW_NUM(array,type) sizeof(array)/ARRAY2_COL_SIZE(array)
int main(){int a[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};int (*p)[4] = a;int row,col;int i,j; row = ARRAY2_ROW_NUM(a,int);col = ARRAY2_COL_NUM(a,int);for(i=0;i<row;i++){for(j=0;j<col;j++){printf("%-2d ",*(*p+j));//p是二維數(shù)組指針,*p就是a[i]即一維數(shù)組的指針,偏移量為int }printf("\n");p++;//p是二維數(shù)組指針,偏移量為sizeof(int)*col即按行偏移 } return 0;
}
上述代碼中也可以用一個(gè)指針來尋址:例如a[3][4],尋址a[2][1]只需訪問&a[0][0]+2*4+1
練習(xí):使用a來訪問a[2][1]這個(gè)元素
首先需要偏移到第2行,之后偏移到第1列,最后取值
- 偏移到第2行:a+2
- 偏移到第1列之前需要先轉(zhuǎn)換成一維數(shù)組名:*(a+2)即a[2]
- 偏移到第1列:*(a+2)+1
- 取值:*(*(a+2)+1)
4、&a是什么
二維數(shù)組的&a分析方法與一維數(shù)組的分析類似。
- 在一維數(shù)組中,我們把a(bǔ)看作列地址,&a看成行地址。
- 在二維數(shù)組中,我們把整個(gè)二維數(shù)組看成列地址,代表偏移量為一行。&a看成行地址,代表偏移量為一整個(gè)二維數(shù)組。
數(shù)組指針(字符串)
字符串是一維數(shù)組的一種形式,數(shù)組指針的性質(zhì)與一維數(shù)組的數(shù)組指針性質(zhì)完全一樣。
下面分析字符串常量與字符串變量的區(qū)別:
指針直接賦值字符串,而不是字符數(shù)組名時(shí),該指針指向的就是字符串常量。
/* p指向字符串常量,不可修改值 */
char* p = "Hello";/* p指向字符串變量,可以修改值 */
char a[] = "hello";
char*p = a;
相同點(diǎn):
- 都是存放的字符串的首地址,都可以用%s進(jìn)行打印
不同點(diǎn):
- 對(duì)于char* p = "Hello";因?yàn)樗且粋€(gè)常量,所以不允許修改,即:*p = 'a'是不合法的。
- 對(duì)于char* p = a;因?yàn)樗且粋€(gè)變量,所以允許修改,即:*p = 'a'是合法的。