补充:指针、结构体和字符串中的注意点-创新互联
char * fgets ( char * str, int num, FILE * stream );
其中num表示其能读入的字符串的大长度,FILE *为文件指针。
fgets函数较gets函数而言更为安全,更推荐使用。
具体示例:
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
当且仅当作函数形参的时候地位完全相等。
对于结构体而言,结构名是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);
(因为函数中局部变量的地址在函数结束后无效)
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://scjbc.cn/article/dejedc.html