结构体中(.)和(->)的区别
首先,要了解
(*a).b 等价于 a->b。
概念上:
一般情况下用“.”,只需要声明一个结构体。格式是,结构体类型名+结构体名。然后用结构体名加“.”加域名就可以引用域 了。因为自动分配了结构体的内存。如同 int a;一样。
而用“->”,则要声明一个结构体的指针,还要手动开辟一个该结构体的内存,然后把返回的指针给声明的结构体指针,才能用“->”正确引用。否则内存中只分配了指针的内存,没有分配结构体的内存,导致想要的结构体实际上是不存在。这时候用“->”引用自然出错了,因为没有结构体,自然没有结构体的域了。
二者的相同点:
两个都是二元操作符,其右操作符是成员的名称。
二者的不同点
点操作符左边的操作数是一个“结果为结构”的表达式;
箭头操作符左边的操作数是一个指向结构的指针。
#include <string.h>
Song_t son1, song2; //两个Song_t类型的对象
Song_t *pSong = &song1; //和一个指向Song_t的指针
strcpy(song1.composer,"Ottma Liebert");
song1.duration = 251;
song1.published.year = 1998;
if((*pSong).duration >180)
printf("The song is more than 3 mimutes long.\n");
-最后一句也可以改写为:
if(pSong->duration > 180) ....
另外一点体会:如果一个函数的传入参数是结构体,且需要该结构体作为返回值的时候,必须采用指针传递的方式,其中对结构体赋值必须使用箭头运算符。
int iSetValue(Song_t *pSong)
{
strcpy( pSong ->composer,"123");
pSong->duration = 251;
...
}
指针的初始化
初始化为NULL:
char * ptr = NULL;
初始化为指向某个变量:
int num = 5;
int *ptr = #
动态内存分配初始化:
可以使用malloc或calloc函数来动态分配内存,并将分配的内存地址赋值给指针
typedef struct num {
int age;
int sid;
} num1;
num1 *num;
num = (num1*)malloc(sizeof(num1));
if(NULL == num)
{
...
}
memset(num, 0, sizeof(num1)); // 将内存区域设置为零
calloc函数一般调用形式:
(类型说明符 *)calloc(n,size)
n和size的作用是在内存动态存储区域中分配n块长度为size字节的连续存储区域,函数返回值为该区域首地址。
struct addrbook
{
char name[30];
char mobilephone[20];
char addr[50];
unsigned int zipcode;
};
struct addrbook *paddrbook;
paddrbook=(struct addrbook *)calloc(100,sizeof(struct addrbook));
与malloc函数的区别:
1.calloc函数一次可分配n块相同区域的字节。
2.calloc函数在分配内存区域的同时会初始化这段内存区域为0.
字符数字初始化
char str1 = 'A';
char str2[] = {'H', 'e', 'l', 'l', 'o', '\0'}; // 注意:'\0' 是字符串的终止符
char str3[] = "Hello"; // 这将复制字符串"Hello"到字符数组中
char str4[6] = {0}; // 预留足够的空间来存储字符串"Hello",并设置为0
strcpy(str4, "Hello"); // 将字符串复制到str4中