结构的名称 - 指针

时间:2014-08-20 13:50:20

标签: c pointers structure

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

有关:

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

我可以将函数调用为:

function(&array_X);
function(array_X);

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

7 个答案:

答案 0 :(得分:2)

  

我可以双向调用函数

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

  

什么代表结构的名称?

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

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

答案 1 :(得分:0)

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

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

如果你有结构 -

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

答案 2 :(得分:0)

你犯了一个错误。

致电

function(&array_X);

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

int[] *

这是完全不同的含义。

结构是一样的想法。

最好首先让你清楚地了解类型树。

答案 3 :(得分:0)

只有数组表达式“衰减”到C中的指针; struct表达式没有。如果需要指向结构的指针,则必须使用&运算符。

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

谢谢,

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

#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
}

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

答案 6 :(得分:-1)

只有第二个是正确的! &#34;&amp;&#34;因为参数在其他编程语言中使用,而不是在C中使用。