簡體   English   中英

C數組聲明和賦值?

[英]C array declaration and assignment?

我問過的結構類似的問題在這里 ,但我試圖找出ç如何處理像變量賦值的東西,為什么不允許將它們分配到海誓山盟,如果他們在功能上是相同的。

可以說我有兩個數組:

int x[10];  
int y[10];  

為什么x = y不能編譯? 如果它們都是相同的“簽名”,那么你不應該來回分配它們嗎?

我是否可以通過允許我在C中執行此操作的方式聲明這些內容? 你能夠做到這一點對我有意義,但也許有辦法可以做到這一點? 結構的Typedef似乎是解決方案,它對於數組聲明和賦值是否相同?

我感謝你們的幫助,我是Stackoverflow的新手,但到目前為止它對我來說是一個非常好的資源!

簡單地說,數組不可分配。 它們是“不可修改的左值”。 這當然引出了一個問題:為什么? 有關更多信息,請參閱此問題:

為什么C ++支持在結構中成員分配數組,但一般不支持?

數組不是指針。 這里的x 確實引用了一個數組,盡管在許多情況下這會“衰減”(被隱式轉換)到指向其第一個元素的指針。 同樣, y也是數組的名稱,而不是指針。

你可以在結構中進行數組賦值:

struct data {
    int arr[10];
};

struct data x = {/* blah */};
struct data y;
y = x;

但你無法直接使用數組。 使用memcpy

int x [sz];
int *y = x;

這個編譯, y將與x相同。

這里的一些消息說數組的名稱產生其第一個元素的地址。 並非總是如此:

#include <stdio.h>

int
main(void)
{
  int array[10];

  /*
   * Print the size of the whole array then the size of a pointer to the
   * first element.
   */
  printf("%u %u\n", (unsigned int)sizeof array, (unsigned int)sizeof &array[0]);

  /*
   * You can take the address of array, which gives you a pointer to the whole
   * array. The difference between ``pointer to array'' and ``pointer to the
   * first element of the array'' matters when you're doing pointer arithmetic.
   */
  printf("%p %p\n", (void*)(&array + 1), (void*)(array + 1));

  return 0;
}

輸出:

40 4
0xbfbf2ca4 0xbfbf2c80

為了補充Blank的答案,我設計了以下程序:

localhost:~ david$ cat test.c
#include <stdlib.h>
#include <stdio.h>
int main (int argc, char * argv [])
{
  struct data {
    int c [2];
  } x, y;
  x.c[0] = x.c[1] = 0;
  y.c[0] = y.c[1] = 1;
  printf("x.c %p %i %i\n", x.c, x.c[0], x.c[1]);
  printf("y.c %p %i %i\n", y.c, y.c[0], y.c[1]);
  x = y;
  printf("x.c %p %i %i\n", x.c, x.c[0], x.c[1]);
  printf("y.c %p %i %i\n", y.c, y.c[0], y.c[1]);

  return 0;
}

執行時,輸出以下內容:

x.c 0x7fff5fbff870 0 0
y.c 0x7fff5fbff860 1 1
x.c 0x7fff5fbff870 1 1
y.c 0x7fff5fbff860 1 1

關鍵是要說明結構值的副本是如何發生的。

為了分配數組,您必須在數組內分配值。

即。 x = y相當於

for(int i = 0; i < 10 < ++i)
{
x[i] = y[i];
}

當說“int x [10]”說,“為10個整數保留一些空間並向我傳遞指向該位置的指針”。 因此,要使副本有意義,您需要對指向的內存進行操作,而不是“內存位置的名稱”。

因此,對於復制,您可以使用for循環或memcpy()。

我已經使用了C編譯器,它可以編譯得很好......運行時代碼會使x指向y的數組。

你會看到,在C中,數組的名稱是指向數組開頭的指針。 實際上,數組和指針基本上是可互換的。 您可以使用任何指針並將其索引為數組。

早在70年代早期開發C時,它就意味着相對較小的程序在抽象中幾乎不會超過匯編語言。 在那種環境中,能夠輕松地在數組索引和指針數學之間來回切換是非常方便的。 另一方面,復制整個數據陣列是一件非常昂貴的事情,而且幾乎沒有什么東西可以被用戶鼓勵或抽象出來。

是的,在這些現代時代,讓數組的名稱成為“整個數組”的簡寫,而不是“對數組前面的思考”更有意義。 然而,C並不是在這些現代時期設計的。 如果你想要一種語言,試試Ada。 x:= y確實有你所期望的; 它將一個數組的內容復制到另一個數組。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM