本文目錄一覽:
- 1、論述C語言中指針的概念和作用,並舉例說明
- 2、c語言的兩個指針例子?????
- 3、C語言指針數組的作用
- 4、C語言如何定義指針指向字元型二維數組
- 5、C語言 指針數組的使用
- 6、C語言中,如何定義一個『指針數組』,這個『指針數組』專門用來存放『數組指針』。
論述C語言中指針的概念和作用,並舉例說明
1、指針概念:變數的地址(計算機內存位元組的編號)叫做指針,存放變數地址的變數叫指針變
量,
簡言之,指針是用來存放地址的。
2、作用:指向這個變數或數組的首地址,是變數的間接引用方式。其值如果改變,變數的值或數組元素的值也會跟著改變。程序對變數的操作實際上是對變數所在的存儲空間讀取和寫入數據。方便對變數的操作。
舉例說明:
int
a=3;/*定義一個整型變數a,並賦初值3*/
int
*p;/*定義一個指針變數P*/
p=a;/*讓p指向a的首地址,也就是a的地址*/
程序為a分配一個2個位元組的存儲單元,假如2個位元組的地址分別為(ABCD1和ABCD2,唯一),那麼p裡面放的值就是ABCD1,不是3。這時可通過p直接引用a,實際上*p=3。以後不管a存放在內存中的哪個地方,只用通過調用p就可以引用a。這時如果令*p=4,則最後的a值也為4。對於數組,指針是指向數組的首地址。
c語言的兩個指針例子?????
個人認為:
(1)printf(PF,a,*a,a[0],a[0],a[0][0]); //a、a[0]表示整個數組的起始地址,其他三個表示數組第0行的起始地址跟整個數組的起始地址相同
printf(PF,a+1,*(a+1),a[1],a[1],a[1][0]);//a+1、a[1]表示數組第1行的起始地址,其他三個表示數組第1行第0個數的地址跟數組第1行的起始地址相同
printf(PF,a+2,*(a+2),a[2],a[2],a[2][0]); //同上,第2行
printf(“%d,%d\n”,a[1]+1,*(a+1)+1); //a[1]+1與*(a+1)+1都表示數組第1行第1個數的地址
printf(“%d,%d\n”,*(a[1]+1),*(*(a+1)+1));//這二個指針都表示數組第1行第1個數的值
(2)b[10]是已經申請好的空間,不能改變其地址
C語言指針數組的作用
指針數組:數組成員是指針的數組。
作用:數組的屬性全有。因為成員是指針,這就可以延伸出很多內容。包括:
成員是函數指針,整個數組就是一類相關函數的集合,便於代碼架構的管理。
成員是鏈表指針啦,char指針,這種就是能做出類似散列表的結構。
總體來講,就是一組相關數據的指針的集合,達到的目的就是搜集指向相關數據的指針放到一個集合裡面。
C語言如何定義指針指向字元型二維數組
使用指針變數訪問二維數組的任意一個元素的方法:
1.使用列指針:定義一個列指針p,讓它指向二維數組的第0個元素
int a[3][4];
int *p;
p=a[0][0];
//因為a[0]是第0行的數組名,所以p=a[0][0]相當於p=a[0],因為a[i][j]前面共有i*4+j個元素
該二維數組的任意i行j列元素可表示為*(p+i*4+j)。
2.使用行指針:定義一個行指針p,讓它指向二維數組的第0行
int a[3][4];
int (*p)[4];
p=a; //也可以為p=a[0];
其中* ( *(p+i)+j)表示任意一個i行j列的元素。
擴展資料:
數組的使用規則:
1.可以只給部分元素賦初值。當{ }中值的個數少於元素個數時,只給前面部分元素賦值。例如:static int a[10]={0,1,2,3,4};表示只給a[0]~a[4]5個元素賦值,而後5個元素自動賦0值。
2.只能給元素逐個賦值,不能給數組整體賦值。例如給十個元素全部賦1值,只能寫為:static int a[10]={1,1,1,1,1,1,1,1,1,1};而不能寫為:static int a[10]=1;請注意:在C、C#語言中是這樣,但並非在所有涉及數組的地方都這樣,資料庫是從1開始。
3.如不給可初始化的數組賦初值,則全部元素均為0值。
4.如給全部元素賦值,則在數組說明中, 可以不給出數組元素的個數。例如:static int a[5]={1,2,3,4,5};可寫為:static int a[]={1,2,3,4,5};動態賦值可以在程序執行過程中,對數組作動態賦值。這時可用循環語句配合scanf函數逐個對數組元素賦值。
參考資料:
百度百科-數組
C語言 指針數組的使用
int **a可以表達一個二維數組。為什麼呢?
你可以這麼理解 * p[3]表達的是一個數組指針,這個指針 p[0]表示的是數組存的第一個地址。而數組實際上是一串連續地址的塊。每一個小塊存著一個內容。每次訪問數組時,你為什麼可以用數組名+下標訪問呢? //比如a[i];
實際上就是 訪問*a+i; * 這個符號可以表示你存的是變數的地址。而數組地址的第一位為int類型變數存的地址(你可以直接使用數組的地址加上單位變數的空間的大小去訪問下個元素)。在這個程序中int *p[3] 表示可以存三個int 類型的地址。而p正好把二維數組的三個一維數組的開頭的int類型變數的地址給存起來了。
給你舉個例子
我現在輸出的是地址,是不是連續的?
用*運算符獲取地址的內容。
實際上p[i]與 *(p+i)是表達的是同一個意思。只不過只有數組可以定義一個連續的空間
(數組的第一個地址是隨機的其他的是連續的。)單獨用指針的話會隨機分配的
數組的指針可以存三個地址。當然可以訪問二維數組了。
C語言中,如何定義一個『指針數組』,這個『指針數組』專門用來存放『數組指針』。
指針數組定義int*p[n];
[]優先順序高,先與p結合成為一個數組,再由int*說明這是一個整型指針數組,它有n個指針類型的數組元素。這裡執行p+1時,則p指向下一個數組元素,
這樣賦值是錯誤的:p=a;因為p是個不可知的表示,只存在p[0]、p[1]、p[2]…p[n-1],而且它們分別是指針變數可以用來存放變數地址。但可以這樣*p=a;這裡*p表示指針數組第一個元素的值,a的首地址的值。
數組指針定義int(*p)[n];
()優先順序高,首先說明p是一個指針,指向一個整型的一維數組,這個一維數組的長度是n,也可以說是p的步長。也就是說執行p+1時,p要跨過n個整型數據的長度。
如要將二維數組賦給一指針,應這樣賦值:
int a[3][4];
int(*p)[4];//該語句是定義一個數組指針,指向含4個元素的一維數組。
p=a;//將該二維數組的首地址賦給p,也就是a[0]或a[0][0]
p++;//該語句執行過後,也就是p=p+1;p跨過行a[0][]指向了行a[1][]
擴展資料:
與數組指針關係
數組指針是指向數組首元素的地址的指針,其本質為指針(這個指針存放的是數組首地址的地址,相當於2級指針,這個指針不可移動);指針數組是數組元素為指針的數組,其本質為數組。
例如:*p[2]是指針數組,實質是一個數組,裡面的兩個元素都是指針,[]的優先順序比*的優先順序高,p先與[]結合,形成數組p[2],有兩個元素的數組,再與*結合,表示此數組是指針類型的,每個數組元素相當於一個指針變數
與二維數組對比
二維數組:如char string_1[10][10]只要定義了一個二維數組,無論賦不賦值,系統都會給他分配相應空間,而且該空間一定是連續的。其每個元素表示一個字元。我們可以通過指定下標對其元素進行修改。
指針數組:如char*str_B[5]系統至少會分配5個連續的空間用來存儲5個元素,表示str_B是一個5個元素的數組,每個元素是一個指向字元型數據的一個指針。
如果我做這樣的定義:
char a[3][8]={“gain”,”much”,”strong”};
char*n[3]={“gain”,”much”,”strong”};
他們在內存的存儲方式分別如右圖所示,可見,系統給數組a分配了
3×8的空間,而給n分配的空間則取決於具體字元串的長度。
此外,系統分配給a的空間是連續的,而給n分配的空間則不一定連續。
由此可見,相比於比二維字元數組,指針數組有明顯的優點:一是指針數組中每個元素所指的字元串不必限制在相同的字元長度;二是訪問指針數組中的一個元素是用指針間接進行的,效率比下標方式要高。但是二維字元數組卻可以通過下標很方便的修改某一元素的值,而指針數組卻無法這麼做。
舉例編輯
數組指針:
#includelt;stdio.hgt;
int main()
{
char c[][4]={“哥”,”哥”,”我”,”岸”,”上”,”走”};//UTF-8:一個漢字=3個位元組
char(*p)[4];
int i;p=c;//將指針定位於c[0]
for(i=0;ilt;=5;i++)
{
printf(“%s,”,*(p+i));//或者將*(p+i)替換成*p++
}
printf(“\n”);
for(i=5;igt;=0;i–)
{
printf(“%s,”,*(p+i));//或者將*(p+i)替換成*–p
}
return 0;
}
指針數組:
#includelt;stdio.hgt;
int main()
{
int i;
char*pch[6]={“妹”,”妹”,”你”,”坐”,”船”,”頭”};
for(i=0;ilt;6;i++){
printf(“%s,”,pchlt;igt;);
}
printf(“\n”);
for(i=5;igt;=0;i–){
printf(“%s\n”,pchlt;igt;);
}
return 0;
}
參考資料:
百度百科——指針數組
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/295775.html