我刚刚开始弄乱结构和指针。

这是我的.h:

#ifndef struct_struct_h
#include <string.h>
#define struct_struct_h



#endif


int count=0;

typedef struct
{
    int num;
    double balance;
    const char * name;
    struct Account * acnt;

} Account;

Account* a = NULL;

Account* new_account(const char * n)
{
    Account *a1 = malloc(sizeof(Account));

    a1->num=++count;
    a1->name = n;
    return a1;
}


这是我的main.c:

#include <stdio.h>
#include <string.h>
#include "struct.h"



int main(int argc, const char * argv[])
{

    // insert code here...
    Account* accounts[2];

    for(int i=0; i<2; i++)
    {
        accounts[i] = (i==0 ? new_account("David") : new_account("Toto") );
    }
    printf("Accounts array address is %i\n",&accounts);

    for(int i=0; i<2;i++)
    {
        printf("Account n°%i is owned by %s \n, its address is %i\n",accounts[i]->num,accounts[i]->name,&accounts[i]);
    }
    printf("There are %i accounts.\n",count);

    return 0;
}


如果用帐户替换&accounts,我将得到相同的结果:@array,要么是&accounts [0],就可以。


  帐户阵列地址为1606416480


如果我确实将*&accounts替换为* accounts,我会得到:


  帐户阵列地址为1063600


第二个输出是:


  帐户n°1由David拥有
  ,它的地址是1606416480
  
  帐户n°2由Toto拥有
  ,它的地址是1606416488


实际上,这些是帐户中包含的帐户指针@,这些@各自占用8B的内存空间。

如果将&accounts [i]替换为accounts [i],则将* accounts [i]替换为:


  帐户n°1由David拥有
  ,地址是1063600
  
  帐户n°2由Toto拥有,其地址是1063632
  
  帐户n°1由David拥有
  ,地址是3874
  
  帐户n°2由Toto拥有
  ,它的地址是3880


在第一种情况下,我有2个指针,在第二种情况下,我有2个*指针。

* STRUCT和STRUCT不同,为什么?

最佳答案

数组在内部表示为连续的内存范围。在扩展的最开始,放置了数组的第一个元素。

例如,如果您使用问题accounts中相同的方式命名数组,则该数组的地址和该数组的第一个元素的地址将具有相同的值。

如果考虑你的例子,那么你有

Account * accounts[2];


表达式中具有极少数例外的数组(例如在sizeof运算符中使用它们)将转换为指向其第一个元素的指针。

因此表达式accounts具有类型Account **和等式

accounts == &accounts[0]


评估为true。

表达式&accounts具有相同的值,因为它是扩展区的地址,但类型不同。它的类型是

Account * ( * )[2]


那是如果你写例如

Account *( *p )[2] = accounts;

printf( "*p = %zu\n", sizeof( *p ) );


那么输出将等于16,因为在您运行自己的代码的环境中,指针的大小等于8,并且数组由两个元素组成,它们是指针。

您可能没有写条件

&accounts == accounts


因为操作数具有不同的类型。但是如果你写

( void *)&accounts == ( void * ) accounts


那么此条件的评估结果为true。

所以表达式的值

&accountsaccounts&accounts[0]彼此相等,并且是数组占用的内存范围的地址。

至于结构,则结构的地址等于其第一成员的地址。但是,结构类型的对象名称不会隐式转换为指向其第一个成员的指针。


  如果将&accounts [i]替换为accounts [i],则将* accounts [i]替换为:


&accounts[i]给出数组元素的地址。这样您将获得价值

Account n°1 is owned by David , its address is 1606416480

Account n°2 is owned by Toto , its address is 1606416488


值之间的差等于8,即表达式sizeof( Account * )的值

accounts[i]给出存储在数组元素中的值。它们是结构类型的每个对象的动态分配内存的地址。

* accounts [i]是结构类型的对象。由于printf调用中的格式说明符与作为参数传递的对象不对应,因此该函数的行为未定义。

考虑到要打印指针,您必须使用格式说明符%p

关于c - &array ==数组,结构呢?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35748999/

10-11 22:06