C程序设计第6 7章

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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值