c语言小记

 结构体中(.)和(->)的区别

首先,要了解
(*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 = &num;

动态内存分配初始化:

可以使用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中

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值