C 指向另一个变量的指针

C 指向另一个变量的指针,c,pointers,C,Pointers,我试图为数组元素创建一个别名(firstElementNum),以便从程序员那里抽象出复杂性。这是我的密码: typedef struct { int structNum; } myStruct; myStruct myArray[10]; int *const firstElementNum = myArray[0].structNum; 当我尝试这一点时,我得到了初始值设定项元素不是常量。我猜这意味着右手边必须是一个定义的常数。那么我应该如何将这个指针分配给我的目标元素呢 in

我试图为数组元素创建一个别名(
firstElementNum
),以便从程序员那里抽象出复杂性。这是我的密码:

typedef struct {
    int structNum;
} myStruct;

myStruct myArray[10];

int *const firstElementNum = myArray[0].structNum;
当我尝试这一点时,我得到了
初始值设定项元素不是常量。我猜这意味着右手边必须是一个定义的常数。那么我应该如何将这个指针分配给我的目标元素呢

int *const firstElementNum = &myArray[0].structNum;
请注意“address of”操作符
&
,因为您希望
firstElementNum
指向
myArray[0].structNum
的地址

firstElementNum = 5;

请注意“address of”操作符
&
,因为您希望
firstElementNum
指向
myArray[0]的地址。structNum

从您的问题中可以看出,您不清楚指针的基本规则。许多在C标签上贴问题的人对此并不清楚。基本上:

firstElementNum = 5;
  • 存储位置可以保存特定类型的值
  • 如果将
    &
    运算符应用于存储位置,则会获得指向关联类型的指针
  • 指针是一个值
  • 如果将
    *
    运算符应用于指针,则会得到一个存储位置
从技术上讲,存储位置被称为“左值”,但对于初学者来说,这似乎是不必要的行话

>让我们看一下:

int *const firstElementNum = myArray[0].structNum;
那是不对的
structNum
是包含类型为
int
的值的存储位置。但是要分配给
firstElementNum
,我们需要一个类型为“指向
int
的指针”的表达式

请重试:

int *const firstElementNum = &myArray[0].structNum;
那更好
structNum
是类型为
int
的存储位置。
&
运算符为您提供指向
int
的指针。这是一个可以存储在存储位置
firstElementNum
中的值

firstElementNum = 5;
这是双重错误;首先,您试图写入一个
const
存储位置,其次,这试图将
int
类型的值分配给“指向
int
的指针”类型的存储位置


这是对的
firstElementNum
是一个包含指向
int
的指针的存储位置。将
*
应用于该值将生成类型为
int
的存储位置,这正是您所需要的。

从您的问题中可以看出,您不清楚指针的基本规则。许多在C标签上贴问题的人对此并不清楚。基本上:

  • 存储位置可以保存特定类型的值
  • 如果将
    &
    运算符应用于存储位置,则会获得指向关联类型的指针
  • 指针是一个值
  • 如果将
    *
    运算符应用于指针,则会得到一个存储位置
从技术上讲,存储位置被称为“左值”,但对于初学者来说,这似乎是不必要的行话

>让我们看一下:

int *const firstElementNum = myArray[0].structNum;
那是不对的
structNum
是包含类型为
int
的值的存储位置。但是要分配给
firstElementNum
,我们需要一个类型为“指向
int
的指针”的表达式

请重试:

int *const firstElementNum = &myArray[0].structNum;
那更好
structNum
是类型为
int
的存储位置。
&
运算符为您提供指向
int
的指针。这是一个可以存储在存储位置
firstElementNum
中的值

firstElementNum = 5;
这是双重错误;首先,您试图写入一个
const
存储位置,其次,这试图将
int
类型的值分配给“指向
int
的指针”类型的存储位置


这是对的
firstElementNum
是一个包含指向
int
的指针的存储位置。将
*
应用于该值会生成一个类型为
int
的存储位置,这正是您所需要的。

要理解
int*const
是什么:从后面读取它,即
指向整数的常量指针

所以必须将其分配给指针,而不是整数

int *const firstElementNum = &myArray[0].structNum;

现在,您可以使用差异运算符访问该值:
*firstElementNum
要了解
int*const
是什么:从后面读取它,即指向整数的
常量指针

firstElementNum = 5;
所以必须将其分配给指针,而不是整数

int *const firstElementNum = &myArray[0].structNum;

现在,您可以使用deference操作符访问该值:
*firstElementNum

非常好。但是为了分配它,例如,
firstElementNum=5
抱怨我试图写入只读变量,这表示它试图覆盖指针。如果我做了
*firstElementNum
,它就不再抱怨了,所以我每次读写别名时都必须取消对别名的引用吗?@CJxD是的,没错。指针不是严格意义上的别名。非常好。但是为了分配它,例如,
firstElementNum=5
抱怨我试图写入只读变量,这表示它试图覆盖指针。如果我做了
*firstElementNum
,它就不再抱怨了,所以我每次读写别名时都必须取消对别名的引用吗?@CJxD是的,没错。指针不是严格意义上的别名。
firstElementNum = 5;