Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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_Arrays_Variables_Pointers_Memory - Fatal编程技术网

C 何时在指针赋值中使用*?

C 何时在指针赋值中使用*?,c,arrays,variables,pointers,memory,C,Arrays,Variables,Pointers,Memory,当我学习C时,我经常看到指针 我得到一个指针保存着内存中不同位置的十六进制值。因此,指针就是这样的:0x7fff5fbff85c 每个指针也是一种不同的类型 int var = 10; int *ptr = &var; 这里的Ptr指向var的位置。要获得var的值,我必须使用*Ptr取消对指针的引用。 像 将打印'Var=10 但是,如果我对指针执行非内联声明,如: int var = 10; int *ptr; ptr = &var; 当我实际为指针分配内存地址时,我不必

当我学习C时,我经常看到指针

我得到一个指针保存着内存中不同位置的十六进制值。因此,指针就是这样的:
0x7fff5fbff85c

每个指针也是一种不同的类型

int var = 10;
int *ptr = &var;
这里的Ptr指向var的位置。要获得var的值,我必须使用
*Ptr
取消对指针的引用。 像

将打印'Var=10

但是,如果我对指针执行非内联声明,如:

int var = 10;
int *ptr;
ptr = &var;
当我实际为指针分配内存地址时,我不必使用第三行中的
*
。 但当我得到一个带指针的函数时:

int var = 10;
void assignPointer(int *ptr) {
*ptr = 10;
}
哦,等等!在写这篇文章时,我意识到指针有两种不同的赋值:

*ptr = 10;

有什么区别?在第一种情况下,我是否首先解除指针的引用,将10分配给指针所在的位置? 在第二种情况下,我将实际位置分配给指针

在作业方面,我有点困惑什么时候使用*和什么时候不使用

如果我使用数组,为什么我需要指针呢

int array[];
这里的“数组”已经保存了十六进制内存位置。这不是一个指针吗?所以,如果我想给数组赋值,我会写:

*array = [10, 2];
首先我去引用,然后我分配

我迷路了:(

编辑:可能有点不清楚。 我不知道当你在使用指针的时候,什么时候必须使用a*,什么时候不用。 所有携带十六进制的东西都是指针,对吗? 数组的变量名携带它的十六进制内存位置。那么为什么它不是指针呢


EDIT2:谢谢大家,你们帮了我很多!

您的一个示例无效。
*ptr=10;
。原因是10是一个值,但没有分配给它的内存

你可以把你的例子想象成“将某物指定给地址”或“某物的地址是”


int*ptr
是指向某物地址的指针。因此
ptr=&val;
意味着ptr等于val的地址。然后你可以说
*ptr=10;
val=10;
因为*ptr和val都在看同一个内存位置,因此是相同的值。(注意我没有说“指向”).

你说得很对

在第一种情况下,我是否首先解除对指针的引用,将10分配给指针所在的位置?在第二种情况下,我将实际位置分配给指针

没错。正如你所看到的,这是两个逻辑上不同的动作

这里的“数组”已经保存了十六进制的内存位置。这不就是指针吗

你在这里也掌握了它。为了你的理解,我想说数组是指针。但实际上它并不是那么简单——数组在大多数情况下只会衰减为指针。如果你真的对这件事感兴趣,你可以在这里找到一些很棒的帖子


但是,由于它只是一个指针,所以不能“赋值给数组”。在任何C语言书的“字符串”下,通常都会以非常好的方式解释如何在指针上下文中处理数组节。

C语法与此类似。当您声明变量时,
*
仅用于指示指针类型。它实际上并不取消引用任何内容。因此

int *foo = &bar;
就好像是你写的

int *foo;
foo = &bar;

指针的声明类似于常规变量。声明过程中,指针名称前面带有星号字符,以将其区分为指针。在声明中,您没有取消引用,例如:

int a = 0;
int *p = &a // here the pointer of type int is declared and assigned the address of the variable a
声明语句之后,要为指针分配地址或值,请使用不带星号的名称,例如:

int a;
int *p;
p = &a;
要为指针的目标分配一个值,可以通过在指针名称前面加上
*
来解除对它的引用:

int a = 0;
int *p;
p = &a;
*p = 1;

解除引用的指针是它指向的内存。只是不要混淆声明指针和使用指针

如果在类型附近的声明中写入
*
,可能会更容易理解:

int* p;


关于赋值和解引用之间的区别,您是对的

您需要了解的是,数组变量是指向连续内存区域的第一个元素的指针

因此,您可以通过取消引用指针来访问第一个元素:

*array = 10;
您可以通过取消引用指向第n个元素的指针来访问第n个元素:

*(array + (n * sizeof(my_array_type)) ) = 10;
array[n] = 10; 
其中,地址是指向第一个元素的指针加上指向第n个元素的偏移量(使用此数组中元素的大小乘以n计算)

您还可以使用访问第n个元素的等效语法:

*(array + (n * sizeof(my_array_type)) ) = 10;
array[n] = 10; 
我不知道在使用指针时何时必须使用*而不是。所有携带十六进制的东西都是指针,对吗?数组的变量名携带十六进制的内存位置。那么为什么它不是指针呢? 首先要做的最后一件事-数组的名称不是指针;它不会在任何位置存储地址。定义数组时,它的布局大致如下所示:

那么以下是正确的:
表达式类型衰减为值
----------         ----        ---------        -----
arr T[N]T*第一个元素的地址
&arr T(*)[N]N/a数组地址(相同值)
如上
*arr T不适用于arr[0]的值
第i个元素的arr[i]T n/a值
&arr[i]T*n/a第i个元素的地址
大小arr大小\u t存储单元数(字节)
由arr接管

表达式
arr
&arrarray[n] = 10; 
+---+ arr: | | arr[0] Increasing address +---+ | | | arr[1] | +---+ | ... | +---+ | | | arr[n-1] V +---+
T arr[N]; // for any type T
void bar( T *p )
{
  *p = new_value();  // write new value to *p
}

void foo( void )
{
  T var;
  bar( &var );  // write a new value to var
}
 p == &var
*p == var
void bar( T p )
{
  p = new_value();  // write new value to p
}

void foo( void )
{
  T var;
  bar( var );  // var is not updated
}
int x = 0, y = 1;
int *p = &x; // p initially points to x
printf( "&x = %p, x = %d, p = %p, *p = %d\n", (void *) &x, x, (void *) p, *p );
*p = 3;
printf( "&x = %p, x = %d, p = %p, *p = %d\n", (void *) &x, x, (void *) p, *p );
p = y; // set p to point to y
printf( "&y = %p, y = %d, p = %p, *p = %d\n", (void *) &y, y, (void *) p, *p );
int *p;
p = &x;
x = *p;
int *p;