亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用C返回數組

使用C返回數組

C++ C
呼如林 2019-06-03 15:05:52
使用C返回數組我對C比較陌生,我需要一些處理數組的方法的幫助。來自Java編程,我習慣于說int [] method()以返回數組。但是,我發現在使用C時,在返回數組時必須使用指針。作為一個新的程序員,我真的一點也不明白這一點,即使我已經瀏覽了許多論壇?;旧?,我試圖編寫一個在C中返回char數組的方法。我將為該方法提供一個數組(讓我們將其稱為返回數組)。它將從前一個數組創建一個新數組,并返回指向該數組的指針。我只需要一些幫助,如何開始這一點,以及如何讀取指針,一旦它被發送出數組。任何解釋這一點的幫助都是非常感謝的。陣列返回函數的編碼格式char *returnArray(char array []){  char returned [10];  //methods to pull values from array, interpret them, and then create new array  return &(returned[0]); //is this correct?}函數調用方int main(){  int i=0;  char array []={1,0,0,0,0,1,1};  char arrayCount=0;  char* returnedArray = returnArray(&arrayCount); ///is this correct?  for (i=0; i<10;i++)   printf(%d, ",", returnedArray[i]);  //is this correctly formatted?}我還沒有測試這一點,因為我的C編譯器目前還沒有工作,但是我想弄清楚這一點。
查看完整描述

3 回答

?
九州編程

TA貢獻1785條經驗 獲得超4個贊

C對數組的處理是非常與Java不同,您將不得不相應地調整您的思維。C中的數組不是一流的對象(也就是說,數組表達式在大多數上下文中不保留它的“數組性”)。在C中,“N元素數組”類型的表達式T將隱式轉換(“衰變”)為“類型”的表達式。T“,除非數組表達式是sizeof或一元&運算符,或者如果數組表達式是字符串文本,則用于初始化聲明中的另一個數組。

除其他外,這意味著不能將數組表達式傳遞給函數并使其收到。作為數組類型;該函數實際上接收指針類型:

void foo(char *a, size_t asize){
  // do something with a}int bar(void){
  char str[6] = "Hello";
  foo(str, sizeof str);}

在呼喚foo,表達str從類型轉換為char [6]char *的第一個參數foo宣告char *a而不是char a[6]..在……里面sizeof str,因為數組表達式是sizeof運算符,它沒有轉換為指針類型,因此您可以獲得數組(6)中的字節數。

如果你真的有興趣,你可以讀丹尼斯·里奇的C語言的發展來了解這種治療的來源。

結果是函數不能返回數組類型,這很好,因為數組表達式也不能作為分配的目標。

最安全的方法是調用方定義數組,并將其地址和大小傳遞給應該寫入的函數:

void returnArray(const char *srcArray, size_t srcSize, char *dstArray, char dstSize){
  ...
  dstArray[i] = some_value_derived_from(srcArray[i]);
  ...}int main(void){
  char src[] = "This is a test";
  char dst[sizeof src];
  ...
  returnArray(src, sizeof src, dst, sizeof dst);
  ...}

另一種方法是函數動態分配數組并返回指針和大?。?/trans>

char *returnArray(const char *srcArray, size_t srcSize, size_t *dstSize){
  char *dstArray = malloc(srcSize);
  if (dstArray)
  {
    *dstSize = srcSize;
    ...
  }
  return dstArray;}int main(void){
  char src[] = "This is a test";
  char *dst;
  size_t dstSize;

  dst = returnArray(src, sizeof src, &dstSize);
  ...
  free(dst);
  ...}

在這種情況下,調用方負責使用free圖書館功能。

請注意dst在上面的代碼中,有一個簡單的指針指向char,而不是指向char..C的指針和數組語義使您可以應用下標運算符[]數組類型的表達式。指針類型src[i]dst[i]將訪問i數組的第四個元素(即使只有src有數組類型)。

你,你們能,會,可以聲明指向N元素數組的指針。T做一些類似的事情:

char (*returnArray(const char *srcArr, size_t srcSize))[SOME_SIZE]{
  char (*dstArr)[SOME_SIZE] = malloc(sizeof *dstArr);
  if (dstArr)
  {
    ...
    (*dstArr)[i] = ...;
    ...
  }
  return dstArr;}int main(void){
  char src[] = "This is a test";
  char (*dst)[SOME_SIZE];
  ...
  dst = returnArray(src, sizeof src);
  ...
  printf("%c", (*dst)[j]);
  ...}

以上幾個缺點。首先,C的舊版本期望SOME_SIZE要成為編譯時常量,意味著該函數只能使用一個數組大小。其次,在應用下標之前,必須取消指針的引用,這會使代碼混亂。當您處理多維數組時,指向數組的指針工作得更好。


查看完整回答
反對 回復 2019-06-03
?
鴻蒙傳說

TA貢獻1865條經驗 獲得超7個贊

這個美妙的邪惡實現如何?

數組h

#define IMPORT_ARRAY(TYPE)    \
    \struct TYPE##Array {    \
    TYPE* contents;    \    size_t size;    \};    \
    \struct TYPE##Array new_##TYPE##Array() {    \
    struct TYPE##Array a;    \
    a.contents = NULL;    \
    a.size = 0;    \    return a;    \}    \
    \void array_add(struct TYPE##Array* o, TYPE value) {    \
    TYPE* a = malloc((o->size + 1) * sizeof(TYPE));    \
    TYPE i;    \    for(i = 0; i < o->size; ++i) {    \
        a[i] = o->contents[i];    \    }    \    ++(o->size);    \
    a[o->size - 1] = value;    \
    free(o->contents);    \
    o->contents = a;    \}    \void array_destroy(struct TYPE##Array* o) {    \
    free(o->contents);    \}    \
TYPE* array_begin(struct TYPE##Array* o) {    \
    return o->contents;    \}    \
TYPE* array_end(struct TYPE##Array* o) {    \
    return o->contents + o->size;    \}

主.c

#include <stdlib.h>#include "array.h"IMPORT_ARRAY(int);struct intArray return_an_array() {
    struct intArray a;
    a = new_intArray();
    array_add(&a, 1);
    array_add(&a, 2);
    array_add(&a, 3);
    return a;}int main() {
    struct intArray a;
    int* it;
    int* begin;
    int* end;
    a = return_an_array();
    begin = array_begin(&a);
    end = array_end(&a);
    for(it = begin; it != end; ++it) {
        printf("%d ", *it);
    }
    array_destroy(&a);
    getchar();
    return 0;}


查看完整回答
反對 回復 2019-06-03
  • 3 回答
  • 0 關注
  • 689 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號