c語言返回數組指針
① c語言怎麼讓「函數」返回「指針數組」
你好
從問題來看,似乎你對於指針的概念沒太理解。指針變數中存儲的是內存中的地址,而實際的數據放在這個地址中。
按照這段代碼來說,int* 聲明的指針指向內存中的一塊地址,而在這塊地址中存儲著一個整形數值。所以要返回這樣的值,也就相當於是返回一個內存地址。因此,在程序中有兩種具體的解決辦法:
1.在調用函數的時候,直接將變數的指針(即內存地址)作為參數傳入,在函數執行的時候,就會自動對內存中相應地址的數據進行操作。使用這種方法也就不需要返回值了。具體到這段代碼中,就是在Main中聲明int* tempA[10],把foo函數聲明為void foo(int* a[10]),調用時用foo(tempA),在foo函數中直接使用a[10]即可。
2.直接把內存地址作為返回值,因為在C中,數組名就是數組首元素的指針,因此直接返回數組名就可以了,即return a即可。如果是普通變數,要用取內存地址的運算符&,比如聲明了整型變數 int i,就可以return &i。這與printf函數中的使用方法是相通的。
【按照補充的內容:】
a-------->a1-------->i1
|-------->a2-------->i2
|……………………
|-------->an-------->im
這樣的調用方法,只能保證a1-an不被修改,怎麼保證i1-im不被修改?
希望以上回答能幫到你。【PS.很久沒用C了,如果哪裡出了差錯,請指正。】
② c語言,函數返回數組指針出錯為什麼啊
C語言里不可以返回數組,只能返回指針
函數內的數組是局部變數,離開函數後就會離開了其作用域,原則上講就會被銷毀(實際是編譯器及編譯器選項而定),自然不能被回傳
③ c語言中函數能返回一個數組嗎
不能直接返回一個數組,但是可以用其他方式實現類似功能。
方法1:利用全局變數
分析:全局變數作為C語言的一個知識點,雖然我們都了解它的特點,但在實際教學過程中應用得並不是很多。由於全局變數的作用域是從定義變數開始直到程序結束,而對於編寫有多個返回值的C語言函數,我們可以考慮把要返回的多個值定義成全局變數。當函數被調用時,全局變數被更改,我們再把更改後的全局變數值應用於主調函數中。函數被調用後被更改後的全局變數值即為函數的數個返回值。下面以一個實例演示該方法的應用。
實例1:編寫函數求3個數中的最大值與最小值。
方法:把最大值、最小值分別定義成2個全局變數max、min,在用戶自定義函數中把求出來的最大值與最小值分別賦給全局變數max、min。函數調用完畢後全局變數的max、min值即保存了函數要求返回的值。程序參考代碼如下:
#include "stdio.h"
#include "conio.h"
int max,min;/*定義兩個全局變數用於保存函數返回值*/
void max_min(int a,int b,int c) /*定義求最大最小值的函數*/
{max=min=a; /*初始化最大最小值*/
if(max if(max if(min>b)min=b;
if(min>c)min=c;
}
main()
{int x,y,z;
printf(" 請輸入3個整數:\n");
scanf("%d,%d,%d",&x,&y,&z);
max_min(x,y,z) ;/*調用求最大值與最小值的函數*/
printf("三個數中的最大值為:%d;最小值為:%d",max,min);/*輸出最大值與最小值*/
getch();
}
調試結果如下:
請輸入3個整數:
5,-6,2
三個數中的最大值為:5;最小值為:-6
注意:該方法雖然可以實現有多個返回值的函數,但由於全局變數不能保證值的正確性(因為其作用域是全局,所以程序范圍內都可以修改它的值,如果出現錯誤將非常難以發現),並且全局變數增加了程序間模塊的耦合,所以該方法要慎用。
方法2:傳遞數組指針
分析:在教學過程中,我們知道C語言函數參數的傳遞方式有值傳遞與地址傳遞。當進行值傳遞時,主調函數把實參的值復制給形參,形參獲得從主調函數傳遞過來的值運行函數。在值傳遞過程中被調函數參數值的更改不能導致實參值的更改。而如果是地址傳遞,由於傳遞過程中從實參傳遞過來的是地址,所以被調函數中形參值的更改會直接導致實參值的更改。因此,我們可以考慮把多個返回值作為數組元素定義成一個數組的形式,並使該數組的地址作為函數的形式參數,以傳址方式傳遞數組參數。函數被調用後,形參數組元素改變導致實參改變,我們再從改變後的實參數組元素中獲得函數的多個返回值。以下實例演示該方法的應用。
實例2:編寫函數求一維整形數組的最大值與最小值,並把最大值與最小值返回給主調函數。
方法:以指針方式傳遞該一維數組的地址,然後把數組的最大值與數組的第一個元素交換,把數組的最小值與最後一個元素交換。函數被調用完畢後,實參數組中的第一元素為數組的最大值,實參數組中最後一個元素為數組的最小值,從而實現返回數組的最大值與最小值的功能。程序參考代碼如下:
#include "stdio.h"
#include "conio.h"
void max_min(int *ptr,int n) /*定義求數組最大值最小值的函數,傳遞數組指針*/
{int i,j,k;/*j保存最大值所在位置,k保存最小值所在位置*/
int *temp;/*用於交換位置*/
*temp=*ptr;
for(i=0;i{
if(*ptr<*(ptr+i))/*最大值與第一個元素進行交換*/
{
k=i;
*temp=*ptr;
*ptr=*(ptr+k);
*(ptr+k)=*temp ;
}
if(*(ptr+n-1)>*(ptr+i))/*最小值與最後一個元素進行交換*/
{
j=i;
*temp =*(ptr+n-1);
*(ptr+n-1)=*(ptr+j);
*(ptr+j)= *temp ;}
}
}
/*調用最大最小值函數*/
main()
{
int A[6],i;
for(i=0;i<6;i++)
scanf("%d",&A[i]);
max_min(A,6);
printf("max=%d, min=%d\n \n",A[0],A[5]);
getch();
}
調試結果如下:
請輸入6個整形數,以空格隔開:
5 8 9 32 -6 4
max=32,min=-6
注意:該方法適用於多個返回值的數據類型一致的情況。當返回值數據類型不一致時,不適用該方法
④ C語言 通過指針從函數返回一個數組,編一道簡單的程序解釋
通過指針從函數返回一個數組
換句話說,返回的並不是數組,而是數組的首地址!
#include<stdio.h>
int*fun()//返回類型int*,與returna中的a的類型相同才可以!
{
staticinta[]={1,2,3};//靜態變數,函數結束後,不會被系統回收
returna;//返回數組名,即數組首地址
}
intmain()
{
int*p=fun();//定義整型指針p接收返回地址
inti;
for(i=0;i<3;i++)//遍歷返回的地址中的數據!
printf("%d",p[i]);
printf(" ");
return0;
}
⑤ c語言 函數返回數組指針
由於你在子函數int *shuzu(void)中定義的數組 a[4];屬於局部變數,在子函數結束時會被釋放,所以返回的指針變成野指針,會亂碼;簡單的解決方法有兩種,1. 將數組定義在主函數之前(#include <stdio.h>下面),那麼就變成了全局變數,不會被釋放了;2.使用malloc或者calloc開空間後再賦給這個數組,這樣也不會被釋放了;第一種方法有缺點,以後學到全局變數的時候會知道,第二種方法估計你還沒學到,不過很簡單,網路一下就會了~~~
⑥ C語言數組指針
int (*pstu)[4];為指向有4個元素的數組的指針
int* getPosPerson(int pos, int (*pstu)[4]);為返回值為指針的函數
注意這是指針函數,而不是函數指針,後者為指向函數的指針變數,兩者含義是不同的
(類似指針數組和數組指針,兩者含義也是不同的,一個本質是數組,一個本質是指針)
調用該函數的語句為:ppos =getPosPerson(pos,scores);
傳入的scores表示3行4列的二維數組首行數組的地址,即&scores[0]
調用後相當於int (*pstu)[4]=scores,所以在getPosPerson中pstu與scores是等價的
即pstu可看作&scores[0],那麼pstu+pos也就等價於scores+pos,等價於&scores[pos]
即返回了指向&scores[pos](也就是scores第pos+1行的地址)的指針
返回該行指針ppos後,就可以查看該行表示的學生的4科成績了
⑦ C語言怎麼讓「函數」返回「指針數組」
首先,你不應該返回局部變數的指針,因為局部變數在離開函數後就會被銷毀。如果你想這樣返回一個數組的話,你應該malloc出一個數組來返回。
至於應該return什麼,return
(malloc出來的那個指針)就可以了。
例如
int**
foo()
{
int
**p
=
(int
**)malloc(sizeof(int
*)*10);
...
...
...
return
p;
}
這個p指向一個內存段,這個內存段存有十個int*類型的元素。
⑧ c語言函數返回數組
函數是無法返回數組的,只能返回指針,但返回指針的弊端是指針指向的內存不能是函數的局部變數的。所以還得用傳出參數,有兩個辦法,一是直接用一個array就搞定,另它的每一行的最後一列是計算出來的平均值;另一個方法就是再傳入進去一個指針,返回平均數。第一種可以不修改當前介面直接改,但如果無所謂還是第二種比較好,代碼如下:
voidstudent_aver(floatarray[3][3],floataverage[3]){
inti,j;
floatsum;
for(i=0;i<3;i++){
sum=0;
for(j=0;j<3;j++)
sum=sum+array[i][j];
average[i]=sum/3;
}
}
⑨ C語言調用數組返回數組怎麼做
#include <stdio.h>
#define MIN(x,y)
int * add_1();
main()
{
int * p = add_1();
int b[5];
for(int i=0;i<5;i++)
{
b[i] = *(p+i);
}
for(i=0;i<5;i++)
{
printf("%d",b[i]);
}
}
int * add_1()
{
int static a[5]={1,2,3,4,5};
return a;
}
(9)c語言返回數組指針擴展閱讀:
注意事項
一、該數組不能是返回函數的局部變數數組,因為此鬧局部變數數組在退出函數後會被釋放。
可以是全局變數,靜態局部變數歲渣,動態分配內存,以及從函數參數傳過來的數組地址。
二、返回指針時,無法返回長度,所以需要其它方式傳回數組長度,以下是幾種常用的方法。
1、約定固定長度。
2、以函數參數返回數森雀罩組長度。
3、將長度保存在全局變數中。
4、約定數組結束標記。
5、在數組中存儲數組長度,如存在第一個元素中。
有些時候需要子函數將一個數組返回出來,通常是兩種方法,一種是靠指針,另一種是結構體。
例如指針:
#include <stdio.h>
char *test(char *tmp)
{
return tmp;
}
void main(void)
{
printf("%s",test("第一個測試例子 "));
}