Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
简单C问题关于*_C_Variables_Pointers - Fatal编程技术网

简单C问题关于*

简单C问题关于*,c,variables,pointers,C,Variables,Pointers,我想知道这两行代码之间的区别是什么 int hi; int *hi; 在C编程语言中 谢谢! Amitinthi将变量hi声明为一个。 int*hi将变量hi声明为一个整数。第一个声明一个整数变量,而第二个声明一个指向整数的指针 指针超出了StackOverflow post的范围,但它是一个起点,在学习C的任何一本书中都应该至少有一章介绍指针 int hi; 在内存中为int保留空间,每次引用hi时,您可以在内存空间中直接读取或写入该int int *hi; 在内存中为指向int的指针保

我想知道这两行代码之间的区别是什么

int hi;
int *hi;
在C编程语言中

谢谢!
Amit

inthi
将变量hi声明为一个。
int*hi
将变量hi声明为一个整数。

第一个声明一个整数变量,而第二个声明一个指向整数的指针

指针超出了StackOverflow post的范围,但它是一个起点,在学习C的任何一本书中都应该至少有一章介绍指针

int hi;
在内存中为
int
保留空间,每次引用
hi
时,您可以在内存空间中直接读取或写入该
int

int *hi;
在内存中为指向
int
指针保留空间,每次使用
hi
时,都会读取或写入指针。这意味着您没有使用
int
,只有指向
int
的指针-必须存在
int
,指针才能引用可行的内容。比如说

 int hi;
 int *phi;
 phi = &hi; // phi references the int hi
 *phi = 3;  // set `hi` to 3
a<代码>inti
b<代码>整数*地址
c<代码>地址=&i

在a行中声明了一个名为
i
的整数变量。完成此操作后,编译器将保留大小为
sizeof(int)
的内存空间(在我的计算机上为4字节)。如果要引用此内存空间,则必须使用指针

第b行声明了一个名为
address
的变量,该变量具有特殊属性。此变量不包含
int
,但它存储类型为
int
的变量的地址。因此,无论
address
有什么值,它都应该被解释为
int
类型变量的地址。目前,变量
address
中没有任何内存地址,因为我们还没有定义它必须保存哪个变量的内存地址

第c行可以理解为“地址等于变量
i
”的内存地址。现在,变量地址存储
int
变量
i
的内存地址

int main(){
  int a;
  int &b;
  b=&a;
  a=10;
  return 0;
}
使用调试器运行此代码时,我看到:

a = 10 // the variable's value  
b = 0x7fffffffe2fc // this is the address at which 'a' is stored.  
指针非常强大,一旦你理解了它,你就会开始更频繁地使用它。除了其他人建议您阅读的材料外,我建议您使用调试器(gdb)并运行一些带有指针的程序,并检查代码中声明的每个变量。当我对任何问题有一个直观的了解时,我会更好地理解事情,我认为这可能会加快你对指针的理解

int hi-----表示hi是为其分配2个字节的整数。 int*hi-----*表示保存变量地址的指针,该变量为整数。 两者都不同。一个表示整数,另一个表示整数的地址。

inthi; 在内存中为整型变量保留一个位置,同时 int*ptr; 在内存中为包含其他变量的内存地址的指针保留一个位置。您可以以不同的方式使用指针

int *ptr = hi;
int *ptr;
ptr = &hi; 
当您更改ptr的值时,您将更改其指向的地址,但如果您在取消引用地址后更改了该值,则您将更改其他变量的值

*ptr = 3;

导致hi值的改变

hi
将整型值存储在特定位置,但
*hi
存储任何int类型变量的地址

例如:

int hi = 10;
int *hello = &hi;
第一-国际hi; 这里声明一个名为“hi”的整数变量

然后-int*hi; 这里的“hi”是一个指针,可以指向整数值


注意:int*hi和int*hi在语法上是相同的

感谢您的编辑,@failured…您可能想更深入地理解指针:太棒了。这正是我想知道的。我能再问你一个问题吗?我见过指针被广泛使用。为什么?为什么它们如此特别?为什么有些人更喜欢使用指针而不仅仅是整数?对不起,不是指整数,而是指整数变量。再加一句,对不起。如果我有这样的东西:
inthi[4];int*phi;phi=&hi[2]
这将为phi提供
hi
数组的第三个(假设为0索引)值。现在有没有可能在没有指针的情况下实现这一点?例如:
inthi[4];int-phi;phi=hi[2]。这不也是一回事吗?如果是这样的话,我现在终于明白为什么指针是有用的了。@Amit为什么使用指针?C和C++允许间接的级别(不像java,至少不是直接的)。根据您的示例,您可以在内存中保留一个整数字符串(数组),并有一个指向该区域的指针,即第一个。然后,该语言允许使用指针、post或pre增量等方便地在该字符串中导航。。。按照相同的方案,您可以只提供一个指向
int
字符串的指针,而不是提供整个数组。允许对指针等进行操作。。。(比如,试着用谷歌搜索“c指针”。@Amit II
phi=&hi[2]
将phi设置为
hi
的第三个int所在的内存位置的地址。然后,
*phi=4
hi[2]
设置为4。你可以做
phi=&hi*(φ+2)=4phi[2]=4