标题:结构体指针地址和值的问题
只看楼主
Emotiona
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:311
专家分:581
注 册:2017-3-7
结帖率:97.5%
已结贴  问题点数:18 回复次数:18 
结构体指针地址和值的问题
#include<stdio.h>
#include<malloc.h>

typedef struct
{
    int num[15];
    char name[15];
    float score[3];
    double aver;
    double sum;
}Stu;

int input (Stu* p)
{
    int n, i, j;
    printf("please input N students information!\n");
    scanf("%d", &n);
    p=(Stu* )malloc(n * sizeof(Stu));
    for (i = 0; i < n ; i++, p++)
    {
        printf("input score of student%d\n", i + 1);
        scanf("%d%s",&p[i].num, p[i].name);printf("%d    %s  ",*p[i].num, p[i].name);    一直都没想明白。输入&p[i].num,为啥输出的时候要加*号才是p[i].num的值。p[i].name则不用,因为他是字符串
        for (j = 0; j < 3; j++)
        {scanf("%f", &p[i].score[j]);printf("%7.2f", p[i].score[j]);}        而这里的p[i]p[j]也要&,因为它是浮点数。为啥输出就不需要加*,有点不明白。麻烦大牛帮忙解析下。不然没法继续做题啊。谢谢!!!
    }
    return n;
}
int main ()
{
    int n;
    Stu St, *Sp;
    n=input(&St);
    //Handle(Sp, n);
}
搜索更多相关主题的帖子: 结构体 double please include 
2017-04-04 12:13
sharplong
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:122
专家分:121
注 册:2017-3-27
得分:5 
scanf("%d%s",p[i].num, p[i].name);去掉&是可以的,因为都是首地址
printf("%d    %s  ",*p[i].num, p[i].name);去掉*是不可以的,应为要使用*取值。name是字符串给出地址就能%s出来。
总的来说是整形数组和字符串数组有点小区别吧。

程序代码:
#include<stdio.h>
#include<malloc.h>

int main ()
{
    int in[2]={1,2};
    char a[4]="abc";
    printf("%d\n",*in);//加*
    printf("%s",a);
    return 0;
}

我自己的看法,和你一起等待大牛解答

[此贴子已经被作者于2017-4-4 13:31编辑过]


跟据科学研究呢,拥有一个良好的头像呢,有助于提高帖子关注度,和被友好对待的可能性:)准确来说呢,其实,我是一个演员....和兼职汽车维修员
2017-04-04 13:24
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
得分:5 
回复 楼主 Emotiona
这样写我醉了看看下面这行代码~感觉没咋人会这样写的~

程序代码:
#include<stdio.h>
#include<malloc.h>

void fun(int* a)
{
    a=(int* )malloc(2*sizeof(int ));
    a[0]=0;
    a[1]=1;
    printf("%d\n",a[1]);
    
    free(a);
}

int main()
{
    int a=0;
    
    fun(&a);
    
    return 0;
}


我醉了好像在调用函数外面malloc提供的地址找不回来了~虽然加个返回值可以~但这样完全可以在调用函数里面另外开个变量啊~

楼主的那个程序在执行完第一个调用函数外里面的东西就会找不回来了~~~

[此贴子已经被作者于2017-4-4 13:48编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-04-04 13:32
Emotiona
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:311
专家分:581
注 册:2017-3-7
得分:0 
回复 3楼 九转星河
我考虑到过,在函数开辟空间和主函数开辟空间的问题。我现在想要解决的是哪个地址和值的问题。没弄明白,希望你给我讲解下,谢谢
2017-04-04 13:46
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
得分:0 
回复 4楼 Emotiona
先弄清楚地址~地址值和值的关系~

地址和地址值是不同的东西啊~

地址是常量~是不能更改的~地址值是变量~是可以更改的~虽然两者的值可以相等~但不能等价~

判断哪个是地址哪个是值可以看看变量类型~

举个简单的例子~

int* p[i]={0};

p是指针数组~是一个地址值~
p[i]是指针数组里面的内容~其实实质是一个普通变量~只不过这个变量一般是用来存放地址值的~
*p就是指代p[0]~

int (*p)[10]=NULL;

p是一个指针~指向一个有十个元素的指针数组~
*p也是一个指针~实质是指针数组~不过每个相邻*p之间的空间间隔为10*sizeof(int* )
int (*p+i)[j]是就是指p[i][j]~就是指代一个p指向的二维数组里面的一个变量的值~

这些要慢慢理解的~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-04-04 14:18
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1728
专家分:3216
注 册:2015-12-2
得分:5 
问题出在前面而不是后面
#include<stdio.h>
main()
{
      int a[10];
      //scanf("%d",a);//这一行与下一行等效
      scanf("%d",&a);
      printf("%d",*a);
      }
2017-04-04 14:56
Emotiona
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:311
专家分:581
注 册:2017-3-7
得分:0 
回复 5楼 九转星河
前面是头晕了,把指针数组想成一位数组了。scanf("%f", &p[i].score[j]);printf("%7.2f", p[i].score[j]);    这句又是怎么理解的。和指针数组不一样
2017-04-04 15:04
Emotiona
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:311
专家分:581
注 册:2017-3-7
得分:0 
回复 6楼 ehszt
把申请空间放前面了  scanf("%f", &p[i].score[j]);printf("%7.2f", p[i].score[j]);    这句又是怎么理解的,只有这样才能引用结构体里面的score元素
void input (Stu* p, int n)
{
    int i, j;

    for (i = 0; i < n ; i++, p++)
    {
        printf("input score of student%d\n", i + 1);
        scanf("%d%s",p[i].num, p[i].name);printf("%d    %s  ",*p[i].num, p[i].name);
        for (j = 0; j < 3; j++)
        {scanf("%f", p[i].score[j]);printf("%7.2f", p[i].score[j]);}
    }
}
int main ()
{
    int n;
    Stu *St;
    printf("please input N students information!\n");
    scanf("%d", &n);
    St=(Stu* )malloc(n * sizeof(Stu));
    input(St, n);
    printf("%d", *St->num);
    //Handle(Sp, n);
}
2017-04-04 15:08
Emotiona
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:311
专家分:581
注 册:2017-3-7
得分:0 
回复 3楼 九转星河
我考虑到过,在函数开辟空间和主函数开辟空间的问题。我现在想要解决的是哪个地址和值的问题。没弄明白,希望你给我讲解下,谢谢
2017-04-04 15:10
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1728
专家分:3216
注 册:2015-12-2
得分:0 
scanf("%d%s",&p[i].num, p[i].name);printf("%d    %s  ",*p[i].num, p[i].name);
这句你num后面没加下标看见没,
scanf("%f", &p[i].score[j]);printf("%7.2f", p[i].score[j]);
score后面你加了下标。
2017-04-04 15:28



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-475773-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.113338 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved