c語言,結構體

 

數據類型分爲4種, 簡單數據類型,構造數據類型,指針數據類型,空類型。html

結構體屬於構造數據類型,用struct標識。linux

聲明一個結構體:

Typedef  struct和structc++

cc#

c++數組

typedef struct tMyStruct安全

{ide

int iNum;函數

long lLength;spa

} ST_MYSTRUCT;指針

 

在C中,這個申明後申請結構變量的方法有兩種:

(1)struct tMyStruct 變量名;;

2ST_MYSTRUCT變量名

在c++中能夠有

(1)struct tMyStruct 變量名;

2ST_MYSTRUCT變量名

(3)tMyStruct 變量名;

typedef struct

{

int a;

}ST_MYSTRUCT;

在聲明變量的時候就可:

ST_MYSTRUCT  st1;

 

typedef struct

{

int a;

}ST_MYSTRUCT,ST_MYSTRUCT_PTR;

定義告終構體類型ST_MYSTRUCT

 

以及結構體指針類型ST_MYSTRUCT_PTR

 

typedef struct  

{

int num;

int age;

}ST_AAA,ST_BBB,ST_CCC;

ST_AAA,ST_BBB,ST_CCC三者都是同一結構體類型。聲明變量時用任何一個均可以,c++中也是如此

 

 

同左。

struct Student {

int a ;

}stu1;        

聲明告終構體類型struct Student

同時也聲明告終構體變量stu1

 

struct {

int a ;

}stu1;        

聲明告終構體變量stu1

 

 

  • 結構體賦值:

struct st1 {
    int a;
    int b;
};

1 對成員賦值.
1.1 用{}形式.
struct st1 st1 = {1,2,3);    //定義並初始化結構體變量
1.2 linux kernel風格.
struct st1 st1 = {    //定義並初始化結構體變量
.a = 1;
.b = 2;
};

2 對總體賦值.
struct st1  a, b;    //聲明結構體變量
b = a;    //結構體直接賦值

3 結構體做爲函數返回值對另外一個結構體賦值.
struct st1 func1();

struct st1 a = func1();

  

  • 結構體直接賦值的不安全因素:(c語言)

struct A{
  char v1[20];
  int v2;
} a,b;

a = b;
這沒有任何問題.

可是:
struct B{
  char *v1;
  int v2;
} c,d;
c = d;
這種結構體賦值,就須要注意(包括在C++裏)。
對於指針賦值,即不是數據進行了複製保存而是多了一個指針指向而已,這樣一旦b對象釋放,a的指向就成了非法的垃圾數據。

因此在c中,自定義類型、數組都是要另外本身定義複製函數的,這主要是代碼安全考慮,而不是語言層面考慮。

 

  • 結構體定義,聲明,賦值:

#include <stdio.h>
//也能夠這樣:
typedef struct st1 {
    int e1;
    int e2;
}ST_MY; //1.定義結構體類型的時候,裏面是分號,定義完畢後要加分號。

ST_MY func1()
{
    ST_MY h = { 77, 88};
    return h;
}

int main()
{
    ST_MY a = { 33, 44}; // 2.定義並初始化一個結構體
    ST_MY b = {
        .e1 = 55, //3.0 定義並初始化一個結構體時,能夠點賦值
    }; //3.1 點賦值只能是初始化結構體變量時才能用
    ST_MY c;
    ST_MY d, e;
    
    c = a;//4.結構體直接賦值(方法1)
    d = func1();//5.結構體直接賦值(方法2)
    e.e2=77; //6.聲明以後爲一個結構體變量賦值效果.不一樣於定義並初始化一個結構體變量。
    
    printf("a.e1 a.e2 is %d %d\n", a.e1, a.e2);
    printf("b.e1 b.e2 is %d %d\n", b.e1, b.e2);
    printf("c.e1 c.e2 is %d %d\n", c.e1, c.e2);
    printf("d.e1 d.e2 is %d %d\n", d.e1, d.e2);
    printf("e.e1 e.e2 is %d %d\n", e.e1, e.e2);
    
    f1();
    
    return 0;
}
/*
root@oucaijun:/work/dcc# gcc *.c; ./a.out
a.e1 a.e2 is 33 44
b.e1 b.e2 is 55 0
c.e1 c.e2 is 33 44
d.e1 d.e2 is 77 88
e.e1 e.e2 is -1074143256 77    //6.聲明以後爲一個結構體變量賦值效果.不一樣於定義並初始化一個結構體變量。
*/

  

  •  結構體與數組比較

結構體是一等公民;

數組是二等公民

從詞條上解釋能夠看出二等公民與一等公民在權利上是有差異的,這個詞頗有意思做爲計算機專業術語,其含義也有殊途同歸之妙!一樣咱們看看維基百科對計算機的術語」first-class citizen"(一等公民)的定義,通常要知足如下幾點,

      • can be stored in variables and data structures
      • can be passed as a parameter to a subroutine
      • can be returned as the result of a subroutine
      • can be constructed at run-time
      • has intrinsic identity (independent of any given name)

對比着上面的定義來看C語言數組,

數組做爲一個函數的參數傳遞時,退化成一個指針;

同時,數組沒法做爲函數的返回值;

也許讓數組更不服氣的是,數組之間不能直接賦值操做,

以下面的操做就是非法的:

int a[10];
int b[10];
a = b;

可是若是數組包裝在結構體中,那麼就能進行賦值了!

相比之下,結構體能夠做爲函數參數和返回值,這就是一等公民的待遇!

 

至於爲何數組必須是二等公民,這是有歷史緣由的,你們能夠參考C 語言的發展史來看,有時間這塊內容我再補上!

 

源文檔 <http://www.cnblogs.com/hazir/p/C_struct_assignment.html>

相關文章
相關標籤/搜索