我刚开始讲指针,有点困惑。我知道&意味着一个变量的地址,*可以用在一个指针变量前面,以获得指针所指向的对象的值。但是当你使用数组、字符串或者使用变量的指针副本调用函数时,情况就不同了。很难看出其中的逻辑模式。
什么时候应该使用&和*?
我刚开始讲指针,有点困惑。我知道&意味着一个变量的地址,*可以用在一个指针变量前面,以获得指针所指向的对象的值。但是当你使用数组、字符串或者使用变量的指针副本调用函数时,情况就不同了。很难看出其中的逻辑模式。
什么时候应该使用&和*?
当前回答
I was looking through all the wordy explanations so instead turned to a video from University of New South Wales for rescue.Here is the simple explanation: if we have a cell that has address x and value 7, the indirect way to ask for address of value 7 is &7 and the indirect way to ask for value at address x is *x.So (cell: x , value: 7) == (cell: &7 , value: *x) .Another way to look into it: John sits at 7th seat.The *7th seat will point to John and &John will give address/location of the 7th seat. This simple explanation helped me and hope it will help others as well. Here is the link for the excellent video: click here.
下面是另一个例子:
#include <stdio.h>
int main()
{
int x; /* A normal integer*/
int *p; /* A pointer to an integer ("*p" is an integer, so p
must be a pointer to an integer) */
p = &x; /* Read it, "assign the address of x to p" */
scanf( "%d", &x ); /* Put a value in x, we could also use p here */
printf( "%d\n", *p ); /* Note the use of the * to get the value */
getchar();
}
附加组件:在使用指针之前总是初始化它们。否则,指针将指向任何东西,这可能导致程序崩溃,因为操作系统将阻止您访问它知道不属于您的内存。但是简单地输入p = &x;,我们为指针分配了一个特定的位置。
其他回答
事实上,你已经掌握了,没有什么你需要知道的了:-)
我想补充以下几点:
这两种操作是截然相反的。&接受一个变量并给你地址,*接受一个地址并给你变量(或内容)。 将数组传递给函数时,数组“降级”为指针。 实际上你可以在间接上有多个层次(char **p表示p是指向一个char的指针的指针。
至于事情的运作方式不同,其实不是这样的:
如前所述,数组在传递给函数时降级为指针(指向数组中的第一个元素);它们不保存大小信息。 C语言中没有字符串,只有字符数组,按照惯例,表示以0(\0)字符结束的字符串。 当你将一个变量的地址传递给一个函数时,你可以去引用指针来改变变量本身(通常变量是按值传递的(数组除外))。
你有指针和值:
int* p; // variable p is pointer to integer type
int i; // integer value
使用*将指针转换为值:
int i2 = *p; // integer i2 is assigned with integer value that pointer p is pointing to
使用&将一个值转换为指针:
int* p2 = &i; // pointer p2 will point to the address of integer i
编辑: 在数组的情况下,它们被处理得非常像指针。如果你认为它们是指针,你将使用*来获取它们内部的值,就像上面解释的那样,但还有另一种更常见的使用[]操作符的方式:
int a[2]; // array of integers
int i = *a; // the value of the first element of a
int i2 = a[0]; // another way to get the first element
要得到第二个元素:
int a[2]; // array
int i = *(a + 1); // the value of the second element
int i2 = a[1]; // the value of the second element
所以[]索引操作符是*操作符的一种特殊形式,它是这样工作的:
a[i] == *(a + i); // these two statements are the same thing
我觉得你有点糊涂了。你应该读一本关于指针的教程/书。
本教程非常适合初学者(清楚地解释了&和*是什么)。别忘了读Kenneth Reek写的《C语言指针》
&和*之间的区别非常明显。
例子:
#include <stdio.h>
int main(){
int x, *p;
p = &x; /* initialise pointer(take the address of x) */
*p = 0; /* set x to zero */
printf("x is %d\n", x);
printf("*p is %d\n", *p);
*p += 1; /* increment what p points to i.e x */
printf("x is %d\n", x);
(*p)++; /* increment what p points to i.e x */
printf("x is %d\n", x);
return 0;
}
是的,这可能相当复杂,因为在C/ c++中*被用于许多不同的目的。
如果*出现在已经声明的变量/函数前面,这意味着:
A) *提供对该变量值的访问(如果该变量的类型是指针类型,或者重载了*操作符)。 B) *具有乘法运算符的含义,在这种情况下,必须有另一个变量在*的左边
如果*出现在变量或函数声明中,则意味着该变量是指针:
int int_value = 1;
int * int_ptr; //can point to another int variable
int int_array1[10]; //can contain up to 10 int values, basically int_array1 is an pointer as well which points to the first int of the array
//int int_array2[]; //illegal, without initializer list..
int int_array3[] = {1,2,3,4,5}; // these two
int int_array4[5] = {1,2,3,4,5}; // are identical
void func_takes_int_ptr1(int *int_ptr){} // these two are identical
void func_takes_int_ptr2(int int_ptr[]){}// and legal
如果&出现在变量或函数声明中,通常意味着该变量是该类型变量的引用。
如果&出现在已经声明的变量前面,则返回该变量的地址
此外,您应该知道,当将一个数组传递给一个函数时,您总是必须传递该数组的数组大小,除非该数组是一个以0结尾的cstring (char数组)。
好吧,看起来你的帖子被编辑了…
double foo[4];
double *bar_1 = &foo[0];
看看如何使用&来获取数组结构开头的地址?以下
Foo_1(double *bar, int size){ return bar[size-1]; }
Foo_2(double bar[], int size){ return bar[size-1]; }
会做同样的事情。