C 何时在指针赋值中使用*?
当我学习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; 当我实际为指针分配内存地址时,我不必
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;