补充:指针、结构体和字符串中的注意点-创新互联

1、 fgets函数 1.1 函数原型:
char * fgets ( char * str, int num, FILE * stream );

其中num表示其能读入的字符串的大长度,FILE *为文件指针。
fgets函数较gets函数而言更为安全,更推荐使用。
具体示例:

创新互联建站专注为客户提供全方位的互联网综合服务,包含不限于网站建设、成都做网站、介休网络推广、成都小程序开发、介休网络营销、介休企业策划、介休品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们大的嘉奖;创新互联建站为所有大学生创业者提供介休建站搭建服务,24小时服务热线:18982081108,官方网址:www.cdcxhl.com
char food[5];
fgets(food, sizeof(food), stdin);

首先,它接收指向缓冲区的指针;
其次,它接收字符串(包括’\0’)的大长度。
stdin为标准输入,表示数据来自键盘
在上面这段代码中,food是数组变量,所以sizeof返回了数组的大小;如果food是指针变量,sizeof仅仅会返回指针的大小。
因此,如果要向fgets()函数中传递数组变量,就用sizeof;如果只是传指针,就应该输入你想要的长度
如:

fgets(food, 5, stdin);

如果food是一个指针,就不能用sizeof,而应该显式给出长度。
2、字符串常量(字符串字面值)

通常储存在只读存储器中
eg.char *str = "hello"; char str[] = "hello";
前者不能修改,只读;后者可读可写。
注意:str[] 和 *str当且仅当作函数形参的时候地位完全相等。

3、结构名和别名

对于结构体而言,结构名是struct关键字后面的那个单词。类型名是指typedef后结构体的名称。
eg.

typedef struct M_book{int a;
	int b;
}Book;

其中的M_book就是结构名,Book就是类型名。如果只写类型名而不写结构名,一般也没问题。(个人更推荐不加结构名的写法)

也可以写成下面这种格式:

typedef struct Hoge{int a;
	int b;
}Hoge;
4、strcmp函数 4.1 函数原型:

int strcmp ( const char * str1, const char * str2 );
即传入的参数必须为char * 类型的,如果a, b的类型为char **,则代码应写成strcmp(*a, *b);

5、不要返回函数中局部变量的地址。

(因为函数中局部变量的地址在函数结束后无效)

6.其他: 6.1 多维数组问题

c语言中准确的说不存在多维数组,而应该称为“数组的数组”。
实例:(非常重要!
对于以下声明,int hoge[3][5];

①hoge的类型为“int 的数组(元素个数5)的数组(元素个数3)”
②尽管如此,在表达式中数组可以被解读成指针。因此,hoge 的类型为“指向int 的数组(元素个数5)的指针

③hoge[i]是*(hoge + i)的语法糖。
1)给指针加上i,就意味着指针前移它指向的类型 * i的距离。
hoge 指向的类型为“int的数组(元素个数5)”,因此,hoge + i让指针前移了 sizeof (int [5]) * i 的距离。

2)通过*(hoge + i)中的* ,去掉一个指针,(hoge + i)的类型就是“指向int 的数组(元素个数5)

3)尽管如此,由于在表达式中,数组可以解读为指针,所以*(hoge + i)的最终类型为“指向int 的指针”。

6.2 突然使用没有指向内存区域的指针(野指针)
int *p;
p[3] = ....
6.3 函数传参

1)返回值类型的指针类型为传入形参的类型。
eg.返回int 型,传入为int *型。

2)将类型T 的数组作为参数进行传递时可以传递“指向T的指针”。
因此,如果想要将“数组a的数组b”作为参数传递,可以考虑传递“指向数组a的指针”。

此外,c标准只承认“指向数组最后元素的下一个元素”是合法的,如果指针指向“最后元素的下下个元素”,即为非法。

7.行指针

具体可参考:
关于C语言行指针的详细解析

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


本文名称:补充:指针、结构体和字符串中的注意点-创新互联
网站链接:http://ybzwz.com/article/dejedc.html