第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

使用C返回?cái)?shù)組

使用C返回?cái)?shù)組

C++ C
呼如林 2019-06-03 15:05:52
使用C返回?cái)?shù)組我對(duì)C比較陌生,我需要一些處理數(shù)組的方法的幫助。來(lái)自Java編程,我習(xí)慣于說(shuō)int [] method()以返回?cái)?shù)組。但是,我發(fā)現(xiàn)在使用C時(shí),在返回?cái)?shù)組時(shí)必須使用指針。作為一個(gè)新的程序員,我真的一點(diǎn)也不明白這一點(diǎn),即使我已經(jīng)瀏覽了許多論壇?;旧?,我試圖編寫一個(gè)在C中返回char數(shù)組的方法。我將為該方法提供一個(gè)數(shù)組(讓我們將其稱為返回?cái)?shù)組)。它將從前一個(gè)數(shù)組創(chuàng)建一個(gè)新數(shù)組,并返回指向該數(shù)組的指針。我只需要一些幫助,如何開始這一點(diǎn),以及如何讀取指針,一旦它被發(fā)送出數(shù)組。任何解釋這一點(diǎn)的幫助都是非常感謝的。陣列返回函數(shù)的編碼格式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?}函數(shù)調(diào)用方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?}我還沒(méi)有測(cè)試這一點(diǎn),因?yàn)槲业腃編譯器目前還沒(méi)有工作,但是我想弄清楚這一點(diǎn)。
查看完整描述

3 回答

?
九州編程

TA貢獻(xiàn)1785條經(jīng)驗(yàn) 獲得超4個(gè)贊

C對(duì)數(shù)組的處理是非常與Java不同,您將不得不相應(yīng)地調(diào)整您的思維。C中的數(shù)組不是一流的對(duì)象(也就是說(shuō),數(shù)組表達(dá)式在大多數(shù)上下文中不保留它的“數(shù)組性”)。在C中,“N元素?cái)?shù)組”類型的表達(dá)式T將隱式轉(zhuǎn)換(“衰變”)為“類型”的表達(dá)式。T“,除非數(shù)組表達(dá)式是sizeof或一元&運(yùn)算符,或者如果數(shù)組表達(dá)式是字符串文本,則用于初始化聲明中的另一個(gè)數(shù)組。

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

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

在呼喚foo,表達(dá)str從類型轉(zhuǎn)換為char [6]char *的第一個(gè)參數(shù)foo宣告char *a而不是char a[6]..在……里面sizeof str,因?yàn)閿?shù)組表達(dá)式是sizeof運(yùn)算符,它沒(méi)有轉(zhuǎn)換為指針類型,因此您可以獲得數(shù)組(6)中的字節(jié)數(shù)。

如果你真的有興趣,你可以讀丹尼斯·里奇的C語(yǔ)言的發(fā)展來(lái)了解這種治療的來(lái)源。

結(jié)果是函數(shù)不能返回?cái)?shù)組類型,這很好,因?yàn)閿?shù)組表達(dá)式也不能作為分配的目標(biāo)。

最安全的方法是調(diào)用方定義數(shù)組,并將其地址和大小傳遞給應(yīng)該寫入的函數(shù):

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

另一種方法是函數(shù)動(dòng)態(tài)分配數(shù)組并返回指針和大?。?/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);
  ...}

在這種情況下,調(diào)用方負(fù)責(zé)使用free圖書館功能。

請(qǐng)注意dst在上面的代碼中,有一個(gè)簡(jiǎn)單的指針指向char,而不是指向char..C的指針和數(shù)組語(yǔ)義使您可以應(yīng)用下標(biāo)運(yùn)算符[]數(shù)組類型的表達(dá)式。指針類型src[i]dst[i]將訪問(wèn)i數(shù)組的第四個(gè)元素(即使只有src有數(shù)組類型)。

你,你們能,會(huì),可以聲明指向N元素?cái)?shù)組的指針。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]);
  ...}

以上幾個(gè)缺點(diǎn)。首先,C的舊版本期望SOME_SIZE要成為編譯時(shí)常量,意味著該函數(shù)只能使用一個(gè)數(shù)組大小。其次,在應(yīng)用下標(biāo)之前,必須取消指針的引用,這會(huì)使代碼混亂。當(dāng)您處理多維數(shù)組時(shí),指向數(shù)組的指針工作得更好。


查看完整回答
反對(duì) 回復(fù) 2019-06-03
?
鴻蒙傳說(shuō)

TA貢獻(xiàn)1865條經(jīng)驗(yàn) 獲得超7個(gè)贊

這個(gè)美妙的邪惡實(shí)現(xiàn)如何?

數(shù)組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;}


查看完整回答
反對(duì) 回復(fù) 2019-06-03
  • 3 回答
  • 0 關(guān)注
  • 685 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)