1. 在函数中定义struct结构体变量,可以返回么?、
答案:可以
原因:在程序中定义的struct变量在return中返回的是该变量的值,就像定义int a, return a一样,返回的是变量a里面的值,而不是该struct的地址。
如:struct point {
int x;
int y;
};
structpoint new_point(int a, int b)
{
struct point tmp;
tmp.x = a;
tmp.y = b;
return tmp;
}
返回的是tmp这个8个字节大小的空间的值,因此在main中执行语句:struct point result = new_point(5, 6);是完全正确的。
但是,如果new_point返回的是局部变量tmp的地址&tmp,那么main中的result指针在后续的使用就有可能出现问题,所以一个函数不应该返回局部变量的地址。
2. 结构体和指针
对于结构体:
struct {
int len;
char *str;
} *p;
前提假设:p->str =strdup("hwt");、
可以得出的结论:sizeof(*p) =16
执行以下四条语句的含义分别为:
语句 | 打印的值 | p(%x) | str(%x) | 备注 |
*p->str | h | a16010 | a16030 |
|
*p->str++ | h | a16010 | a16031 | 指针str指向w |
(*p->str)++ | h | a16010 | a16031 | *str=iwt |
*p++->str | h | a16020 | a16030 | 指针p+1=(char*)p+sizeof(*p) |
3. 栈的分配
针对1中的参数的变量地址:
高地址 |
|
main | |
2dbc | 变量1:a |
2db8 | 变量2:b |
|
|
低地址 | |
2d90 | tmp |
2d8c | 参数a |
2d88 | 参数b |
| new_point返回地址 |
|
|
4. strcpy
函数原型:char *strcpy(char *dest, const char *src);
如果dest为NULL,那么会产生Segmentation fault (core dumped)。
Ø char *dest = "hwt";
char *src = "abc";
dest = src;
printf("dest=%s\n", dest);
结果:打印abc 成功
Ø char dest[] = "hwt";
char src[] = "abc";
dest = src;
printf("dest=%s\n", dest);
结果:在编译时出错error: incompatible types when assigning to type ‘char[4]’ from type‘char’
原因:数组名不是一个变量,所以不能被赋值,数组名代表的是这块空间的地址,代表数组首元素的地址。而指针是一个变量,可以被赋值,被执行算法操作++等,而对数组名执行++错误是不合法的。
Ø char *dest = "hwt";
char src[] = "abc";
dest = src;
printf("dest=%s\n", dest);
结果:打印abc 成功
5. sizeof
Ø sizeof(数组名)的结果为数组的元素个数
Ø sizeof(指针):大小为8或者4,depend on64位或32位的机器。
Ø int a = 5;
sizeof(int), sizeof(i), sizeof i都是合法的,
但是sizeof int是不合法的。error: expected expression before ‘int’ 这两个关键字放在一起就会出现问题。
Ø 在条件编译语句#if中不可以使用sizeof,因为预处理程序在分析#if时,不对类型名字进程分析;而在#define中可以使用sizeof,这是因为预处理程序不计算#define的表达式,而只是简单的进行字符串的替换。
6. 地址相减操作:
main()
{
int a = 5;
int b = 6;
}
&b- &a = 1
所以&arr[m] - &arr[n] = m -n
7. 一个联合union只能用它的第一个成员类型的值来初始化。
8. 不能对位字段进行&操作。
9. stdin,stdout,stderr这三个常量是FILE *类型的,所以可以执行诸如fprintf(stderr,…)此类的操作。
10. va_list, va_start,va_arg, va_end用法
11. typedef和#define的关系:
typedef类似于#define,只有一点不同:由于可被编译程序解释,故typedef能处理文本替换,而这是与处理程序所力不能及的。例如:
typedef int (*PFI)(char *, char *);
定义了类型PFI,表示“指向(具有两个char*参数)返回int类型的函数的指针”,这可被用于某些场合。如PFI strcmp, numcmp;