我刚刚开始弄乱结构和指针。
这是我的.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。
所以表达式的值
&accounts
,accounts
和&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/