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

c語言指針怎麼用在數組

發布時間: 2023-03-19 22:12:54

A. 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),但總體框架就是這樣!

B. 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);

(2)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. 如何在c語言二維數組中使用指針

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

D. 請問在C語言中,函數傳參時怎樣利用指針傳遞數組

數組名就是指針,例如:

#include <stdio.h>

voidpr(char *p)

{

printf(p);

}

void main(void)

{

char s[] = "abc";

pr(s);

}

(4)c語言指針怎麼用在數組擴展閱讀:

注意事項

非數組類的聲明盡量以指針的方式進行比較好。倘若一個指針指向的內存並不是一個數組,那麼採用數組名的聲明方式或許就會給人產生錯誤的引導。類似的,如果指向的是一個數組區域,則會給人以更加豐富的信息。例如:

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

{

/* code here */

}

int main(int argc,char** argv)

{

/* code here */

}

兩種方式完全等價,但是前面一種能夠更清晰地看出:這個參數是指向某個元素起始地址的指針,而後面的這種方式則不能夠直觀地看出這種含義。

E. C語言中用指針變數指向數組元素

main()
{int
a[10];
//定義數組a為整型
int
*p=a,i;
//p指向a的地址,即a[0]的地址
for(i=0;i<10;i++)
scanf("%d",&a[i]);
//給數組a賦值
printf("\n");
for(p-a;p<(a+10);p++)
//輸出數組元素
printf("%d",*p);
//p++表示p指向數組中下一個元素的地址
}
暫時先寫這么多,你一開始沒給p賦值是不對的~

F. C語言 指針數組的使用

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

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

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

給你舉個例子

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

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

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