當前位置:首頁 » 編程語言 » c語言怎樣使用數組指針
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言怎樣使用數組指針

發布時間: 2022-06-24 09:12:05

c語言——數組指針

(1)用數組——

#include"stdio.h"
intmain(intargc,char*argv[]){
charstr[100],i,j;
printf("Pleaseenterastring... ");
scanf("%s",str);
i=0;
while(str[i++]=='*');
i--,j=0;
while(str[j++]=str[i++]);
for(j-=2;str[j]=='*';j--);
str[j+1]='';
printf("%s ",str);
return0;
}

運行樣例:

② c語言數組指針

int (*p2)[5] = &temp;這是一個指針數組;第一個元素存儲的是數組temp的首地址;
*p2等價於&temp; **p2等價於temp數組的第一個元素的值1;
*(*p2+i);等價於*(&temp+i),等價於temp[i];

③ c語言中指針怎麼使用

1、使用場景

使用指針時,必須將它指向一個變數的地址或者為它分配空間方能使用,如下所示:

#include<stdio.h>

#include <stdlib.h>

int main(int argc, char const *argv[])

{

int a[5]={0,1,2,3,4};

int *b,*d;

int c=2;

int *e=a; //e指向a數組首地址

//*b=2; 無法直接初始化

//printf("%d ", *b);

e=e+2; //移動兩個地址單元

d=&c; //d指向c的地址來表示值

c=4; //修改原c變數的值,d指針的值會發生改變

b=(int *)malloc(sizeof(int));//為b分配一個int型空間來直接存儲值

*b=2;//分配空間後可以直接賦值了

printf("this is e,b,c,d :%d %d %d %d ",*e,*b,c,*d);

2、類型說明

(1)int *a :表示一個指向int型變數的指針,指向的是變數的地址單元

(2)char *b:表示一個指向char變數的指針

*a表示的是這個指針指向地址的值,a為此指針本身的地址,這點要明確,一般用*(a+1)、*(a+2)來表示值,如:

int nums[5]={0,1,2,3,4};

int *a=nums;

printf("%d %d %p ",*a,*(a+1),a);

(3)c語言怎樣使用數組指針擴展閱讀:

指針的運算

指針指向變數地址,若原變數的內容發生了變化,它本身也會發生變化,指針之間的運算一般為值運算和地址運算

(1)值運算:直接通過*運算方式,像a+*(a+1),結果為第一個元素與第二個元素相加。

int nums[5]={0,1,2,3,4};

int *a=nums;

(2)地址運算:通過a+i的方式.指針會指向a的下i個地址。

int nums[5]={0,1,2,3,4};

int *a=nums;

a=a+2;

printf("%d ",*a);

結果輸出2。

參考資料來源 :指針-網路

④ 請問C語言里一維數組能用數組指針嗎如果可以怎麼用呢

數組指針可以指向一維數組的。
指針本來就是變數,是用來存放地址的變數。
如:
int (*a)[3],b[12];
a=b;
a++;
之後,*a相當於a[3]

⑤ 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][]

(5)c語言怎樣使用數組指針擴展閱讀:

與數組指針關系

數組指針是指向數組首元素的地址的指針,其本質為指針(這個指針存放的是數組首地址的地址,相當於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分配的空間則不一定連續。

由此可見,相比於比二維字元數組,指針數組有明顯的優點:一是指針數組中每個元素所指的字元串不必限制在相同的字元長度;二是訪問指針數組中的一個元素是用指針間接進行的,效率比下標方式要高。但是二維字元數組卻可以通過下標很方便的修改某一元素的值,而指針數組卻無法這么做。

舉例編輯

數組指針:

#include&lt;stdio.h&gt;

int main()

{

char c[][4]={"哥","哥","我","岸","上","走"};//UTF-8:一個漢字=3個位元組

char(*p)[4];

int i;p=c;//將指針定位於c[0]

for(i=0;i&lt;=5;i++)

{

printf("%s,",*(p+i));//或者將*(p+i)替換成*p++

}

printf(" ");

for(i=5;i&gt;=0;i--)

{

printf("%s,",*(p+i));//或者將*(p+i)替換成*--p

}

return 0;

}

指針數組:

#include&lt;stdio.h&gt;

int main()

{

int i;

char*pch[6]={"妹","妹","你","坐","船","頭"};

for(i=0;i&lt;6;i++){

printf("%s,",pch&lt;i&gt;);

}

printf(" ");

for(i=5;i&gt;=0;i--){

printf("%s ",pch&lt;i&gt;);

}

return 0;

}

⑥ C語言使用數組指針參數傳遞

用指針傳遞一維數組。
#include <stdio.h>
#include <math.h>
float dist( float *p1, float *p2){
float d[3],ds;
int i;
for (i=0;i<3;i++) d[i] = p2[i]-p1[i];
ds = sqrt( d[0]*d[0]+ d[1]*d[1]+d[2]*d[2]);
return ds;
};
void vec( float *p1, float *p2, float *p3){
int i;
for (i=0;i<3;i++) p3[i]=p1[i]+p2[i];
}

int main()
{
float a[3],b[3],c[3];
int i;
printf("input x y z for point 1\n");
for (i=0;i<3;i++)scanf("%f",&a[i]);
printf("input x y z for point 2\n");
for (i=0;i<3;i++)scanf("%f",&b[i]);
printf("distence: %g\n", dist(a,b));
printf("\n");
vec(a,b,c);
for (i=0;i<3;i++) printf("%g ",c[i]);
return 0;
}

⑦ c語言數組指針

② 指向iArray[1]輸出2 (因為*(++p)是先自加然後取指針內容)
③ 指向iArray[1]輸出4 (因為②時p已經成了1,p+2就是3,iArray[3]就是4)
④ 指向iArray[0]輸出2 (因為*(p--)相當於 *(p) ;p--; 是先取值, 然後自減,自減後p=0)
/******
④有異議 不管怎麼樣, 輸出的都是2 ,因為假如是 printf("%d",$(p--)); 則是 printf("$d,$p");p--; 就是輸出的時候, p是指向iArray[1], 但是輸出後就變成了指向iArray[0]了,-----------這里問的p指向:如果是輸出時的指向, 就是iArray[1],如果是輸出後的指向, 就是iArray[0] ,因為這里先問的輸出,又問的指向,所以當作是輸出後指向 所以是iArray[0]
*******/
⑤ 指向iArray[0]輸出1 (因為*p++ 是得到p指向的值之後,把那個值自加 ,但是*p++是先使用*p然後*p自加所以輸出的時候還是*p的內容 ,但是注意, 這時*p已經是2了,也就是iArray[0]從1變成了2)
⑥ 指向iArray[0]輸出2 (因為p是指向數組的索引0的位置,⑤中指針位置沒變,變得是裡面的值,本來是1, ⑤之後變成了2)
⑦ 指向iArray[0]輸出3 (因為++(*p)是取出*p之後, 自加, 然後輸出,所以*p是2 2++是3)
⑧ 指向iArray[0]輸出3 (⑦中沒改變指針, 只改變了指針指向的位置的值, 是⑦中2++的結果,是3)

/*
這里考驗的是i++ 和++ i的區別
比如 a=i++; 相當於 a=i; i++;
而 a=++i ; 則相當於 i++;a=i;
一個是先賦值再遞加,一個是先遞加再復制
另一個是考*p++和*(p++)的區別, *p++改變的是*p的值就是指針指向的值 , 而*(p++)改變的是p的值
*/

⑧ C語言 指針數組的使用

int**a可以表達一個二維數組。為什麼呢?

你可以這么理解*p[3]表達的是一個數組指針,這個指針p[0]表示的是數組存的第一個地址。而數組實際上是一串連續地址的塊。每一個小塊存著一個內容。每次訪問數組時,你為什麼可以用數組名+下標訪問呢?//比如a[i];

實際上就是訪問*a+i;*這個符號可以表示你存的是變數的地址。而數組地址的第一位為int類型變數存的地址(你可以直接使用數組的地址加上單位變數的空間的大小去訪問下個元素)。在這個程序中int*p[3]表示可以存三個int類型的地址。而p正好把二維數組的三個一維數組的開頭的int類型變數的地址給存起來了。

給你舉個例子

實際上p[i]與 *(p+i)是表達的是同一個意思。只不過只有數組可以定義一個連續的空間

(數組的第一個地址是隨機的其他的是連續的。)單獨用指針的話會隨機分配的

數組的指針可以存三個地址。當然可以訪問二維數組了。

⑨ C語言數組指針的具體用法

同意樓上!
不能定義*d[0],因為這個數組的大小為0!
可以這樣來
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char *d[4];
d[0]=malloc(1*sizeof(char));
strcpy(d[0],"web");
printf("%s",d[0]);
return 0;
}
此時*d[]為一個指向指針的指針
d[0]=malloc(1*sizeof(char));
此句話的意思是,分配1個位元組的內存空間給d[0],也就意味著d這個數組的第一個元素[0]內保存的是一個1位元組空間的地址,因為d[0]指向一個地址!

你可以這樣理解
對於普通的數組(例如 char d[4];),在內存中是這樣的
變數:內存地址:內容
d[0]:0x400000h:'w'
d[1]:0x400001h:'e'
d[2]:0x400002h:'b'
d[3]:0x400003h:'\0'
而在此處 char *d[4]; *d[0] = malloc(1*sizeof(char));,是這樣的'
d[0]:0x400000h:0x400100h
d[1]:0x400001h:0x400101h
d[2]:0x400002h:0x400102h
d[3]:0x400003h:0x400103h
而在內存0x400100h處
才保存著"web\0"

不好意思,我上面說錯了,應該是
d[0]:0x400000h:0x400100h
d[1]:0x400001h:NULL
d[2]:0x400002h:NULL
d[3]:0x400003h:NULL
而在內存0x400100h處
0x400100h:'w'
0x400101h:'e'
0x400102h:'b'
0x400103h:'\0'

對應的,你的代碼執行後,內存變數應該是這樣的
d[0]:0x400000h:0x400100h
d[1]:0x400001h:0x400104h
d[2]:0x400002h:0x400108h
d[3]:0x400003h:NULL
在內存0x400100處:
0x400100h:'w'
0x400101h:'e'
0x400102h:'b'
0x400103h:'\0'
0x400104h:隨機字元
......
0x400108h:隨機字元

以上內存地址是以位元組方式內存對齊的,用一些編譯器編譯後可能地址會有些問題(比如d[0]到d[1]不止差了4,可能是8),但總體框架就是這樣!

⑩ 如何在c語言二維數組中使用指針

程序中有些問題:
1、函數的定義有錯誤(參數格式不對);
2、程序中沒有調用函數(或者說是調用格式有誤)
3、函數中的處理邏輯需要修改(一步一步來,這樣容易處理和理解)。
你定義的函數是使用數組作為參數的,數組名本身就是個地址(相當於指針)。
下面在手機上用易歷知食軟體里的微C程序設計來演示修正後的代碼並運行程序,供參考。
手機上修正後的代碼如下圖:
手機上運行的效果如下圖所示: