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 ...