c语言结构体成员在定义是赋值,由结构体成员赋值而引发的一系列问题的讨论...

昨天在用结构体指针给结构体赋初值的时候,犯了一个错误(main函数中被注释掉的那一句话)。而应该采用strcpy的方式把一个字符串放入字符数组中去,对此我将沿着我探讨这个问题根源的思路做一个分享

#include

#include

#include

typedef struct

student_info

{

int number;

char name[32];

}stu, *p_student;

int

main()

{

stu

a; //注意要定义一个结构体出来

p_student p = NULL;

p = &a;

p->number = 1;

//p->name = “aa”;

strcpy(p->name, “aa”);

printf("%d:%s\n", p->number, a.name);

return 0;

}

在发现这个问题之后,我进行了如下的几个尝试:指针对这个数组成员不能赋值,那直接用结构体变量是否可以?(不行);采用普通方式,对结构体变量a在定义的时候初始化,是否可行?(可行)

那么最终问题在于数组初始化和赋值的方面,对此进一步采用了几个程序,对该知识点进行了深入的理解,程序如下

#include

#include

int

main()

{

char a[] = "abcdef";

char *p = "abcdef";

char *p_a = NULL;

//p_a = a;

//fun(&p_a);

//a[0] = 'z';

//a = "z";

//a = 'z';

strcpy(a, "zf");

//p = "z";

*p = 'z';

printf("%s\n", a);

printf("%s\n", p);

//printf("%s\n", p_a);

return 0;

}

int

fun(char **ar)

{

//char **p_a = &ar;

*ar = "zef";

//ar[0] = 'z';

// strcpy(ar, "z");

return 1;

}

以上是我在做知识点归纳时用的源程序,比较混乱,敬请了解。一下我将解释一下,我到底做了那几个方面的工作和讨论

由于关系到字符数组的赋值问题,我想到了这个例子,实验了一下区别

把两个相同的字符串分别赋给一个字符数组,和字符型指针。结果:均可以打印出来

那么它们能否再被赋值修改呢?

对于字符数组而已只能通过a[0] = 'z';或者strcpy(a,

"zf");这样的方式对其进行修改,总结的时候再归纳原因

对于字符型指针,p =

"z";可以,但是注意这里的实质却并没有对p字符串进行修改。而*p = 'z';是不可行的

归纳总结一:

参考网络知识和《c和指针》中关于字符数组的初始化部分

(注意:需要提前搞清楚,什么是赋值,什么是初始化,什么是定义。相关知识可以参考网络资料,eg:int

a;(定义),int a = 10;(初始化),a = 10;(赋值))

1对于字符数组:

char a[15] = “abcdef”;

但不能做如下操作

char a[15];

a[15] = “abcdef”;

特别注意:第一种初始化的方式,看似左值是个字符串,其实不然,它其实是个初始化列表。最后列表包含\0

因此,字符数组是不能将字符串赋给它的!

所以在后续的赋值里必须对数组元素进行赋值

2对于字符串

char *p = “abcdef”;

注意这里不是把一个字符串赋给了一个字符型的指针,而是把一个字符型的指针指向了字符串的首地址。

所以上面p = "z"只是把指针指向了另一个地方而已

3对于数组与字符串在机器中的存储

数组:

数组在机器中,当被定义时eg:char

a[10];就已经分配好了内存空间,放在了数据段中,其中的数值是可以进行修改的

字符串:

字符串在内存中也被存放在了数据段中,但是字符串又称为字符串常量,是编译器“钉死”无法修改的,所以*p =

'z';想改变字符串的值是不被允许的

之后我又进行了一些尝试,那就是将数组作为一个函数的参数进行传递,看变换,这个知识点,我不做操作上的过多复述。

归纳总结二:

在此之前,我们首先得理解,数组名。数组名表示着这个数组的入口地址,这一点与函数名,结构体标识等类似。

eg:char

a[10];那么a表示的是这个数组第一个元素的地址,即&a[0];

而&a;表示的是这个数组的首地址。

估计不少人这个时候糊涂了,这两个有区别吗?数值不一样么?

它们两个的数值是一样的,因为地址只有一个,数组的一个元素的地址的值就是这个数组的地址的值,那么为什么还要分这么细致呢?下面举个例子

eg:

char a[10];

char *p = NULL;

char (*p_a)[10] = NULL;

p = a;

p_a = &a;

如上面这个例子,a只能赋给一个char型的指针,而&a只能赋给一个指向一个数组的指针(注意这里的这个数组要与你定义的那个a数组同大小)

借助指针,我们不难理解,其实他们所代表的一个指针的类型是截然不同的(如果不能理解请参考c相关教程中指针的概念)

进入正文,所以当一个数组被传递如函数的时候可以把数组名传进去,也就是把这个数组的第一个元素的首地址传进去

作为指针被传进去的数组名这时和指针是完全一致的,可以作为指针使用,当然为直观化,可以用做数组

eg:

char a[10];

int fun(char *a)

{

a[0] = ‘A’;

}

至于程序中出现的指针的指针只是在思考时做的讨论,上面的那么其实也可以看做普通指针,这里不做过多说明。

至此关于由一个结构体的赋值而引发的问题就讨论到这里!

(原创文章,作者:三生爱,转载请注明出处)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值