【问题标题】:name of a structure - pointer结构名称 - 指针
【发布时间】:2014-08-20 13:50:20
【问题描述】:

事实:在 ANSI C 中,数组的名称可以用作指针。

为:

unsigned int array_X[10];
void function(unsigned int *array);

我可以两种方式调用函数:

function(&array_X);
function(array_X);

我的问题是,什么代表结构的名称?是不是也是指针,可以和数组一样使用?

【问题讨论】:

  • 简短的回答是:不。如果你有struct类型,那么传递struct类型的变量与传递struct类型的变量的地址是不一样的。
  • function(&array_X);调用不兼容的指针。

标签: c pointers structure


【解决方案1】:

我可以双向调用函数

只有第二种方法是正确的。第一个传递了一个不正确类型的指针,因此可以公平地说它是巧合。

什么代表结构的名称?

它代表了结构本身的价值。该结构的地址恰好与其第一个成员的地址一致,但您必须使用 & 运算符显式获取地址。

回到数组,数组的名称可以用作指向其初始成员的指针这一事实并不意味着数组的名称仅代表该指针:名称代表整个数组,而是编译器知道如何根据使用数组名称的表达式提取指针;这称为数组名衰减

【讨论】:

    【解决方案2】:

    你犯了一个错误。

    通过调用

    function(&array_X);
    

    您将指向 int 数组的指针传递给函数。在c类型系统中,类型应该是

    int[] *
    

    这是完全不同的意思。

    结构是相同的想法。

    最好先让你清楚c中的类型树。

    【讨论】:

      【解决方案3】:

      只有数组表达式“衰减”到 C 中的指针;结构表达式没有。如果你想要一个指向结构的指针,你必须使用& 操作符。

      注意:表达式array_X&array_X 将具有相同的(数组的第一个元素的地址与数组本身的地址相同),但是types 会有所不同;第一个将衰减为unsigned int *,而第二个的类型为unsigned int (*)[10];这些类型不兼容,如果您尝试通过&array_X 代替array_X,您至少应该得到一个警告。

      【讨论】:

        【解决方案4】:

        首先要记住“结构”和“数组”是不同的东西!

        数组是存储在连续内存位置的类似数据类型的集合。但是结构是存储在连续内存位置的不同数据类型的集合!

        如果你有一个结构-

        struct Struct1{
        // members
        }Struct_X;
        
        function(&Struct_X); // if you change any member it will be affected
        
        function(Struct_X); // if you change any member it will not be affected
        

        两者都不一样!

        试试这个例子-

        #include<stdio.h>
        struct st{
                int num;
        };
        void print(struct st temp)
        {
                printf("num= %d\n",temp.num);
        }
        void change(struct st temp)
        {
                temp.num=20;
        }
        void changenum(struct st *temp)
        {
                temp->num=99;
        }
        int main()
        {
                struct st st1;
                st1.num=10;
                print(st1);
                change(st1); // it does not modify the num
                print(st1);
                changenum(&st1); // but it modifies
                print(st1);
        }
        

        输出-

        root@sathish1:~/My Docs/Programs# ./a.out 
        num= 10
        num= 10
        num= 99
        

        【讨论】:

          【解决方案5】:

          也许看看这个问题和我的回答,试图解释数组、指向数组的指针、指向降级数组的指针之间的区别:
          When should an array name be treated as a pointer and when does it just represent the array itself?

          【讨论】:

            【解决方案6】:

            谢谢,

            结构的名称代表结构的真正价值:

            #include <stdio.h>
            #include <string.h>
            
            main()
            {
                struct test_t{
                    unsigned char first;
                    unsigned char second;
                }t_name;
            
                t_name.first = 0x01;
                t_name.second = 0x20;
            
            
                printf("%X", t_name );  // Output: 2001
            }
            

            谈到数组,当我将 &array_X 作为参数传递时,你是对的,这是不正确的,但编译器通常会自动进行指针转换,有些会产生错误或至少是警告。

            【讨论】:

              【解决方案7】:

              只有第二个是正确的! 参数的“&”在其他编程语言中使用,而不是在 C 中。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2020-12-09
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多