问个关于结构体指针和全局变量的问题

不想当主公 2013-07-08 07:32:41
做了一个结构体,然后在所有函数外声明了一个结构体指针变量。一个子函数以这个变量为参数,请问,在子函数里面改变值,会不会影响到外面结构体指针的值?
...全文
500 31 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhxianbin 2013-07-10
  • 打赏
  • 举报
回复
引用 28 楼 u011336497 的回复:
[quote=引用 27 楼 zhxianbin 的回复:] 我说的 k 是结构体变量的指针,为 NULL 是没有指向某一结构体
我知道了,k是地址,*k和struct node xxxx 是等价的,虽然我想不出来创建个node有啥用,函数结束之后就不见了,还不如结构体指针实惠。[/quote] 这种说法是不对的,你要使用node 就必须创建一个:malloc 或者 struct node xxxx。 *k和struct node xxxx 等价必须你这样赋值: k = &xxxx; 也不是函数结束之后就不见了,关键看看你怎么创建的,了解一下下面几个概念:堆、栈、数据区、代码区。
不想当主公 2013-07-10
  • 打赏
  • 举报
回复
引用 27 楼 zhxianbin 的回复:
我说的 k 是结构体变量的指针,为 NULL 是没有指向某一结构体
我知道了,k是地址,*k和struct node xxxx 是等价的,虽然我想不出来创建个node有啥用,函数结束之后就不见了,还不如结构体指针实惠。
zhxianbin 2013-07-10
  • 打赏
  • 举报
回复
我说的 k 是结构体变量的指针,为 NULL 是没有指向某一结构体
yyllyy0910 2013-07-10
  • 打赏
  • 举报
回复
楼主贴个具体的大家一起研究下~然后大家c++试一下~
saiusky21 2013-07-10
  • 打赏
  • 举报
回复
*k和struct node xxxx 等价必须你这样赋值: k = &xxxx
不想当主公 2013-07-09
  • 打赏
  • 举报
回复
引用 24 楼 zhxianbin 的回复:
[quote=引用 22 楼 u011336497 的回复:] [quote=引用 19 楼 zhxianbin 的回复:] [quote=引用 18 楼 u011336497 的回复:] [quote=引用 17 楼 zhxianbin 的回复:] [quote=引用 16 楼 u011336497 的回复:] [quote=引用 15 楼 zhxianbin 的回复:]
test =(struct node*) malloc(100 * sizeof(struct node));
最前面那里不用写成test[100]么?[/quote]不能写[/quote] 太感谢了,还有最后一个问题: 我做的是数据结构的作业,一个结构体指针只有在malloc了之后才能在子函数结束之后继续存在(比如queue那样一个连一个的连起来),但是我可不可以在一个子函数里malloc一个指针变量,然后传给下一个子函数(如果不在这个子函数里再malloc一遍)来连接,我有点担心,毕竟他在下个子函数里没有malloc过,本来这种问题我应该自己查的,但明天就due了,有点来不及。[/quote] 可以,正常就是这么用的。 下面这样: ... struct node* test = (struct node*) malloc(sizeof(struct node)); function1(test); function2(test); free(test); ...[/quote] 那我这样描述对不对,test被传入子函数里面的时候传入的是指针值,只有对test->的元素赋值,才能改变子函数之外的值,否则在子函数里面,对传进来的(假设叫k)k,爱怎么折腾怎么折腾(比如k=NULL)也不会有影响[/quote] 基本是这样,但 k=NULL你就不能 k->x 或 *k 这样操作了[/quote] 你说k->x不能操作我可以理解,但k不是结构体变量么*k岂不是什么值都没有?
zhxianbin 2013-07-09
  • 打赏
  • 举报
回复
引用 22 楼 u011336497 的回复:
[quote=引用 19 楼 zhxianbin 的回复:] [quote=引用 18 楼 u011336497 的回复:] [quote=引用 17 楼 zhxianbin 的回复:] [quote=引用 16 楼 u011336497 的回复:] [quote=引用 15 楼 zhxianbin 的回复:]
test =(struct node*) malloc(100 * sizeof(struct node));
最前面那里不用写成test[100]么?[/quote]不能写[/quote] 太感谢了,还有最后一个问题: 我做的是数据结构的作业,一个结构体指针只有在malloc了之后才能在子函数结束之后继续存在(比如queue那样一个连一个的连起来),但是我可不可以在一个子函数里malloc一个指针变量,然后传给下一个子函数(如果不在这个子函数里再malloc一遍)来连接,我有点担心,毕竟他在下个子函数里没有malloc过,本来这种问题我应该自己查的,但明天就due了,有点来不及。[/quote] 可以,正常就是这么用的。 下面这样: ... struct node* test = (struct node*) malloc(sizeof(struct node)); function1(test); function2(test); free(test); ...[/quote] 那我这样描述对不对,test被传入子函数里面的时候传入的是指针值,只有对test->的元素赋值,才能改变子函数之外的值,否则在子函数里面,对传进来的(假设叫k)k,爱怎么折腾怎么折腾(比如k=NULL)也不会有影响[/quote] 基本是这样,但 k=NULL你就不能 k->x 或 *k 这样操作了
zjwangmin 2013-07-09
  • 打赏
  • 举报
回复
#include <malloc.h>
#include <stdlib.h>

struct node
{
    int key;
    struct node* next;
};

struct node* test;
void change(struct node* k)
{
    k->key=5;
    k->next=NULL;
}
void main()
{
    test = (struct node*)malloc(sizeof(test));  //使用之前要分配内存
    test->key=1;
    test->next=NULL;
    printf("%d\n",test->key);

    change(test);
    printf("%d",test->key);
}
zhxianbin 2013-07-08
  • 打赏
  • 举报
回复
引用 18 楼 u011336497 的回复:
[quote=引用 17 楼 zhxianbin 的回复:] [quote=引用 16 楼 u011336497 的回复:] [quote=引用 15 楼 zhxianbin 的回复:]
test =(struct node*) malloc(100 * sizeof(struct node));
最前面那里不用写成test[100]么?[/quote]不能写[/quote] 太感谢了,还有最后一个问题: 我做的是数据结构的作业,一个结构体指针只有在malloc了之后才能在子函数结束之后继续存在(比如queue那样一个连一个的连起来),但是我可不可以在一个子函数里malloc一个指针变量,然后传给下一个子函数(如果不在这个子函数里再malloc一遍)来连接,我有点担心,毕竟他在下个子函数里没有malloc过,本来这种问题我应该自己查的,但明天就due了,有点来不及。[/quote] 可以,正常就是这么用的。 下面这样: ... struct node* test = (struct node*) malloc(sizeof(struct node)); function1(test); function2(test); free(test); ...
不想当主公 2013-07-08
  • 打赏
  • 举报
回复
引用 17 楼 zhxianbin 的回复:
[quote=引用 16 楼 u011336497 的回复:] [quote=引用 15 楼 zhxianbin 的回复:]
test =(struct node*) malloc(100 * sizeof(struct node));
最前面那里不用写成test[100]么?[/quote]不能写[/quote] 太感谢了,还有最后一个问题: 我做的是数据结构的作业,一个结构体指针只有在malloc了之后才能在子函数结束之后继续存在(比如queue那样一个连一个的连起来),但是我可不可以在一个子函数里malloc一个指针变量,然后传给下一个子函数(如果不在这个子函数里再malloc一遍)来连接,我有点担心,毕竟他在下个子函数里没有malloc过,本来这种问题我应该自己查的,但明天就due了,有点来不及。
zhxianbin 2013-07-08
  • 打赏
  • 举报
回复
引用 16 楼 u011336497 的回复:
[quote=引用 15 楼 zhxianbin 的回复:]
test =(struct node*) malloc(100 * sizeof(struct node));
最前面那里不用写成test[100]么?[/quote]不能写
不想当主公 2013-07-08
  • 打赏
  • 举报
回复
引用 15 楼 zhxianbin 的回复:
test =(struct node*) malloc(100 * sizeof(struct node));
最前面那里不用写成test[100]么?
zhxianbin 2013-07-08
  • 打赏
  • 举报
回复
test =(struct node*) malloc(100 * sizeof(struct node));
不想当主公 2013-07-08
  • 打赏
  • 举报
回复
引用 12 楼 u010917465 的回复:
1.传的是指针,可以改变指针指向的内容,但是指针本身不发生变化; 2.你忘了给指针分配内存了,你这个是野指针啊; 这样:test=(struct *node)malloc(sizeof(struct node)); 你如果每次不想多敲一个struct,可以typedef以下你的struct; 3.如果要做一个链表,记得给每个节点分配内存。
差不多,就是做一种数据结构,我觉得在一个子函数里声明一个节点并分配空间,然后再以这个节点为参数调用另一个子函数,把刚刚建的节点连到比如说queue后面,我见到有人这么做,可是说不通啊,在调用第二个子函数的时候,节点参数被传进去就变成另一个节点,这个节点没有分配空间,但是被连到queue后面,总觉得这样不对劲。
不想当主公 2013-07-08
  • 打赏
  • 举报
回复
引用 11 楼 zhxianbin 的回复:
[quote=引用 10 楼 xian_wwq 的回复:] [quote=引用 9 楼 u011336497 的回复:] [quote=引用 8 楼 zhxianbin 的回复:] 你没有给 test 分配内存 struct node* test; 改为 struct node test;
一定要这样么,我想建个指针变量[/quote] 指针就是个地址,总得指向个有意义的对象吧,否则指针没有意义呀[/quote] struct node* test 这样就没有指向一个有意义的对象了,要么 malloc 要么 赋值[/quote] 请问如果这里test是个结构体数组,可以这样写么? test[100]=(struct node*)malloc(sizeof(struct node));
add1 2013-07-08
  • 打赏
  • 举报
回复
1.传的是指针,可以改变指针指向的内容,但是指针本身不发生变化; 2.你忘了给指针分配内存了,你这个是野指针啊; 这样:test=(struct *node)malloc(sizeof(struct node)); 你如果每次不想多敲一个struct,可以typedef以下你的struct; 3.如果要做一个链表,记得给每个节点分配内存。
zhxianbin 2013-07-08
  • 打赏
  • 举报
回复
引用 10 楼 xian_wwq 的回复:
[quote=引用 9 楼 u011336497 的回复:] [quote=引用 8 楼 zhxianbin 的回复:] 你没有给 test 分配内存 struct node* test; 改为 struct node test;
一定要这样么,我想建个指针变量[/quote] 指针就是个地址,总得指向个有意义的对象吧,否则指针没有意义呀[/quote] struct node* test 这样就没有指向一个有意义的对象了,要么 malloc 要么 赋值
xian_wwq 2013-07-08
  • 打赏
  • 举报
回复
引用 9 楼 u011336497 的回复:
[quote=引用 8 楼 zhxianbin 的回复:] 你没有给 test 分配内存 struct node* test; 改为 struct node test;
一定要这样么,我想建个指针变量[/quote] 指针就是个地址,总得指向个有意义的对象吧,否则指针没有意义呀
不想当主公 2013-07-08
  • 打赏
  • 举报
回复
引用 20 楼 my_live_123 的回复:
[quote=引用 9 楼 u011336497 的回复:] [quote=引用 8 楼 zhxianbin 的回复:] 你没有给 test 分配内存 struct node* test; 改为 struct node test;
一定要这样么,我想建个指针变量[/quote] 一定要区分开什么是指针,什么是指向的变量。 我觉得你把声明的结构体指针当成了结构体类型的变量

struct node *p :指向struct node 类型的指针变量p
struct node p :数据类型是struct node 的变量p
此外,我提醒一点,struct是自定义类型,它和内嵌int float等类型一致, 只不过结构体支持标签 比如:

int a;
struct node{int data;} a;//不适用标签,直接用结构体定义变量

struct node{int data;};//先定义
struct node a;//使用标签定义变量

常见是使用typedef给个别名使用,这样可以缩短像这样的struct here_is_my_define_data_type;否则,每次使用都敲这么长,你会疯掉
[/quote] 那我这样描述对不对,test被传入子函数里面的时候传入的是指针值,只有对test->的元素赋值,才能改变子函数之外的值,否则在子函数里面,对传进来的(假设叫k)k,爱怎么折腾怎么折腾(比如k=NULL)也不会有影响
不想当主公 2013-07-08
  • 打赏
  • 举报
回复
引用 19 楼 zhxianbin 的回复:
[quote=引用 18 楼 u011336497 的回复:] [quote=引用 17 楼 zhxianbin 的回复:] [quote=引用 16 楼 u011336497 的回复:] [quote=引用 15 楼 zhxianbin 的回复:]
test =(struct node*) malloc(100 * sizeof(struct node));
最前面那里不用写成test[100]么?[/quote]不能写[/quote] 太感谢了,还有最后一个问题: 我做的是数据结构的作业,一个结构体指针只有在malloc了之后才能在子函数结束之后继续存在(比如queue那样一个连一个的连起来),但是我可不可以在一个子函数里malloc一个指针变量,然后传给下一个子函数(如果不在这个子函数里再malloc一遍)来连接,我有点担心,毕竟他在下个子函数里没有malloc过,本来这种问题我应该自己查的,但明天就due了,有点来不及。[/quote] 可以,正常就是这么用的。 下面这样: ... struct node* test = (struct node*) malloc(sizeof(struct node)); function1(test); function2(test); free(test); ...[/quote] 那我这样描述对不对,test被传入子函数里面的时候传入的是指针值,只有对test->的元素赋值,才能改变子函数之外的值,否则在子函数里面,对传进来的(假设叫k)k,爱怎么折腾怎么折腾(比如k=NULL)也不会有影响
加载更多回复(11)

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧