C語言中陣列到底是不是指標和陣列作為引數問題

2022-03-09 16:20:31 字數 5617 閱讀 4470

1樓:可靠的張

陣列是實際上指標的語法糖(即指標才是最原始的) ,僅僅在陣列作為形參宣告時陣列才不可 解讀為指標 eg:int func(int a)

和 int func(int *a)

不同,其餘情況都可 進行 指標 和陣列的轉換:即 a[i]=*(a+i)

一般 陣列用於儲存接收,而指標則用於 呼叫相關元素。當然兩者都有前面的功能。

不知 清楚了沒?

2樓:乙浦澤

陣列名可以當做指標來運算,但陣列名是指向陣列首地址的指標常量,不可改變的。比如:

int a[10] = ;

a是陣列的首地址,是不可改變的常量,即a是不可賦值的,a = a+1; 是錯誤的。

當陣列名作為函式的引數時,形引數組中的值發生變化,實引數組中的值也會隨之發生變化,因為兩個指標是指向同一塊地址的;實引數組名的固定常量,形參的陣列名可以做指標變數處理。比如:

void fun(int arr, int n)其中arr在函式內部是可以賦值的。

3樓:春哥

首先看陣列初始化。

int a[8]=;

printf("[%d,%d,%d]/n",a[0],a[1],a[2]);

陣列必須在宣告時定義其大小,否則會出錯

int a; //錯誤

這種沒有指定大小的陣列,可以如下初始化;

int a=;

char a="afasfsafsafsaf";

這種沒有指定大小的陣列,編譯器會根據初始化生成大小。

printf("size%d,%d/n",sizeof(a),sizeof(b));

顯然陣列宣告是個陣列結構不光是指標。

看看下面這段**:

int a=;

void setarray(int a)

void setarray(int*a)

這兩個有區別麼?作為引數時當然沒有區別都是指標了。

c語言中關於陣列名作為函式引數方面的問題

4樓:匿名使用者

不知道你說的第2,4,5語句對應的是什麼。。。。

幫你解釋為什麼是1:

當你呼叫fun(a,b,s);

傳進的引數實際上是:&a[0], &b[0], s變數的值(實際上也就是&a[0])

現在我們把fun的形參換個名字  fun(int *p1, int *p2, int *p3)

進入fun時 p3 = s ,即p3 = &a[0].

你呼叫malloc時返回的值是一個int*,實際上 p3 = malloc返回的新指標p4

*p3=*p1+*(p2++)   即  *p4=*p1+*(p2++);

看到錯誤了嗎,p4並不是s,你算出來的值賦值到malloc返回的指標p4指向的記憶體了。

你想p3(即你的s)拿到計算的值,請把s=(int*)malloc(sizeof(int) );這句去掉。

另外malloc出來的記憶體是需要釋放的,請呼叫free釋放,不然程式不退出的情況下記憶體會佔用。

5樓:白花戀歌

因為c語言函式採用的是傳值呼叫,指標作引數時傳遞給函式的我們給個命名比如s',這時s'==s,然後申請了一塊動態記憶體,申請成功的話會把指標傳遞給s',然後*s『=*p1+*(p2++),所以。。。會產生記憶體洩漏。。。還有就是申請動態記憶體之後一定要檢查申請記憶體是否成功,加一個null判斷

至於你說的第二句和第四句不知道你說的是什麼,以上都是猜測,你參考下吧至於s,它一直指向的是a[0],沒有變過

你要改的話就直接刪除掉動態記憶體那一句,這樣的話,s和s'都是指向a[0]的,當a[0]改變了的時候,s讀取那段記憶體也會得到改變後的值,不過這樣的話a[0]也會由1變成11

6樓:主從報警系統

主程式中的s和fun程式中的s完全是兩個毫不相關的指標變數,你可以看成是int *s_m和int *s_f

s_m指標在fun程式呼叫的那一時刻出來打了下醬油(用來賦值給s_f:s_f = s_m;),後來在fun程式體中:s=(int*)malloc(sizeof(int) ); 這一句的時候,s_m被拋棄了,此時s_f 指向新申請的動態空間了。

7樓:寂寞土人

s=(int*)malloc(sizeof(int)這句分配了一個動態地址,所以已經把指向改變。所以執行fun函式後s的值沒變

c語言指標變數可以當做陣列嗎?

8樓:

比如說定義int *w

然後下邊就可以用作w[i]

這麼對嗎?

對的話在什麼情況下可以這麼使用?

答:不可以,因為w這時還是野指標。只有這樣int *w,a[44];

w=a;

操作後才可以,操作w就與操作a一樣了。而且,操作指標比直接運算元組名更方便,因為指標是變數,可以++、--,而陣列名是常量,不能++、--。

你追問的那個紅框框中的問題不是指標與陣列名的問題,而是「形式引數」與「實際引數」的問題。寫函式定義的()中的前面帶型別說明符的變數名叫形式引數。形參與實參相比,最大的特點就是不用擔心沒有賦值或初始化就拿來引用,它們是留著呼叫時才用實參自動賦值的。

而實參則不然,沒有賦值時拿來做右值,就會被警告「引用了沒有初始化的變數」,而且因為初值是隨機的而結果一般都是錯誤的。

9樓:

c語言指標變數可以當做陣列運用,在應用之前,應該先讓指標指向一個資料塊,可以是程式中的某個陣列(這個就不說了),也可以指向一段新分配的記憶體空間;例如

#include

#include

int main()

如果指向新的記憶體空間時,特別是在子函式中,注意靈活處理要不要釋放該儲存空間。

10樓:zwh寧靜致遠

指標是指向一個地址,不可以那麼用,但是動態的指標是可以的,陣列也是可以的。

11樓:遁世千秋

可以的,你可以先定義一個變數m,給他賦值,然後就可以這樣:int *w=new int[m];

由於m值可以改變多以這相當於定義了一個動態陣列。

12樓:匿名使用者

可以這麼用。為w申請了記憶體空間或者讓它等於另一個已有空間的指標。總之一句話,要有記憶體空間。

你呼叫這個函式的時候,是不是傳的一個陣列,或已申請空間的指標

13樓:

可以吧,指標是地址。int *w表示指向整形資料的指標;當其所指向的地址為某int型陣列首地址時,如:int a[10];w=a;此時w可以如所想當陣列用,但它跟陣列還是有本質的區別,我們一般都將陣列名作為常量指標來處理的。

而w的指向是可變的,所以我們一般都不會將指標當陣列用,因為不安全,當然也可以用const加以修飾,但不如直接用陣列來的直觀。指標運算元組一般是直接移動指標,也就是改變指向吧。

14樓:匿名使用者

這個是可以的!!只不過期本質是不一樣的

15樓:菲菲的

用是可以的,我在傳參的時候這麼用過的。目前可以的

16樓:匿名使用者

int n=10;

char * sz1=new char[n];

char* sz2=new char[n];

class cls

cls cls=new cls();

cls.sz1=sz1;

cls.sz2=sz2;

大致如此吧。

c語言中函式傳陣列和傳指標之間的關係

17樓:匿名使用者

c語言中陣列名實質上就是指標常量,陣列名記錄著陣列的首地址,而運算子就是一種地址運算子,比如a[2]相當於*(a+2);

函式形參是指標還是陣列,在使用中主要區別就是陣列名的數值不可改變,否則無法執行,比如:

void fun(int *p,int a)

18樓:兔姊吥乖

請閱讀《c語言專家程式設計》第四章,詳細介紹了陣列和指標的關係。這本經典的書在網上隨處可下。

c語言專家程式設計

如何在c語言中以陣列指標作為形參輸出陣列

19樓:匿名使用者

//#include "stdafx.h"

#include "stdio.h"

void  cmdsend(unsigned int * info);

int main()

}void  cmdsend(unsigned int * info, unsigned len)

你自己也發現了senddata[2]就是0和你指定'\0'都是ascii 0,還有三個地方要注意,

就是你的形參指標info, 你使用的是*info ++(這意思是指標你陣列元素值在遞增,可是你要的不是地址值遞增嗎,應該是info ++)

for迴圈中你所寫的((*info) != '\0')&& (info != null), 你的*info在sendata[2]就為0了,並且也確實info !

= null, 退出條件都為真,所以你還是照樣輸出到senddata[2]便退出了,所以建議像以上修改,再傳遞一個陣列(即線性表)長度進來,便可以解決這個問題;還有一個辦法,除非你陣列裡的元素不為數字,而是數符,如下

senddata[0] = '8'; //ascii 0x38

senddata[1] = '2'; //ascii 0x32

senddata[2] = '0'; //ascii 0x30(不是ascii 0)

senddata[3] ='4'; //ascii 0x34

senddata[4] ='5'; //ascii 0x35

senddata[5]='\0';

並且你cmdsend函式中,printf("senddata is %c\r\n",*info);即可

stdafx.h這個是哪個標頭檔案,你是不是想用stdio.h??

20樓:匿名使用者

陣列 與 普通指標 的區別:

1、指標的本質是一個與地址相關的複合型別,它的值是資料存放的位置(地址);陣列的本質則是一系列的變數。

2、陣列名對應著(而不是指向)一塊記憶體,其地址與容量在生命期內保持不變,只有陣列的內容可以改變。指標可以隨時指向任意型別的記憶體塊,它的特徵是"可變",所以我們常用指標來操作動態記憶體。

3、當陣列作為函式的引數進行傳遞時,該陣列自動退化為同型別的指標。

因為第三條,當把陣列名作為函式的形參進行傳遞時,該效果等同於傳遞一個同型別的指標。直接在程式當中呼叫 函式名(陣列名)即可。

例程:#include

int a=;

void print(int a)

int main()

21樓:匿名使用者

用那個字串命令 strlen 命令算出陣列長度,for迴圈,按個數輸出

22樓:匿名使用者

#include "stdafx.h"

void cmdsend(unsigned int * info);

int main()

}void cmdsend(unsigned int * info)

C語言中指標與陣列有什麼關係,C語言中,指標和陣列的區別和聯絡

c語言中陣列和引數可以通用,陣列有一個基址,c中用指標指向它,計算陣列元素地址的時候,是基址 元素位元組數 元素序號 1 陣列名bai代表陣列在記憶體du中的首地址。指標可zhi以儲存一個地址dao,也即指向某地回址。在c中,答 對於某地址的訪問有兩種方式 1.直接訪問,如用變數名進行賦值等 2.間...

c語言中“0”到底是不是空格,C語言在中,空格是 0 的標誌嗎

肯定不是空格啊,那個是個顯示不出來的字元,使用來做字串結束標誌的,ascii 碼裡面好多都顯示不出來的字元,列印出來應該都是這個效果的啊。c語言中 0 不是空格,是空字串。0 是字元常量,null 字元,ascii碼數值0,用作字串結尾符。0 是字串,裡面有一個寫入的字串結尾符,還有一個預設的字串結...

陣列名和指標的區別C語言中陣列名和指標的區別

可以!下面是我學習陣列和指標的總結 1 指向陣列首地址 對於一維陣列a 10 陣列的首地址為a 呼叫 p a a i 或者 p i 對於二維陣列a 3 4 整個陣列的首地址為a 0 呼叫 p a 0 a 0 i 或者 p i 此時a代表陣列第一行的地址。3 指向陣列的每行 形如 int a 3 4 ...