C 在指针中*p=var和p=var有什么不同?
我在学习c语言的指针时看到了这些例子,我对指针感到困惑 例1:C 在指针中*p=var和p=var有什么不同?,c,pointers,C,Pointers,我在学习c语言的指针时看到了这些例子,我对指针感到困惑 例1: int i; int a[5] = {1, 2, 3, 4, 5}; int *p = a; // same as int*p = &a[0] for (i = 0; i < 5; i++) { printf("%d", *p); p++; } inti; inta[5]={1,2,3,4,5}; int*p=a;//与int*p=&a[
int i;
int a[5] = {1, 2, 3, 4, 5};
int *p = a; // same as int*p = &a[0]
for (i = 0; i < 5; i++)
{
printf("%d", *p);
p++;
}
inti;
inta[5]={1,2,3,4,5};
int*p=a;//与int*p=&a[0]相同
对于(i=0;i<5;i++)
{
printf(“%d”,*p);
p++;
}
产出:12345
例2:
int arr[2] = {1,2};
int *p;
p = arr;
int i ;
for(i = 0 ; i < 3 ; i++)
{
printf("%d",*p);
p++;
}
int-arr[2]={1,2};
int*p;
p=arr;
int i;
对于(i=0;i<3;i++)
{
printf(“%d”,*p);
p++;
}
产出:122
那么*p=arr和p=arr在指针中的区别是什么呢?我应该在什么时候使用第一个和第二个指针?在这里,您可以定义并初始化指针p
。*
用于向编译器显示p
是指针,它不会取消引用p
int *p = a;
在本例中,您将指针p
与对数组的引用一起分配(在本例中,与您问题中的代码一样,分配给数组arr
)
在上一条语句中,您取消对指针的引用p
,而*
用于取消对指针的引用
printf("%d",*p);
在C编程语言中,在某些情况下,数组name可以衰减为指向
array
中第一个元素的指针。在您的情况下,数组名称在第一个代码段中是a
,在第二个代码段中是arr
,可以衰减为指向内存中数组起始的指针(地址)!因此,对于第一个元素,&arr[0]
,我们可以以某种方式将数组名看作是一个“别名”
需要明确的是,数组不是指针强>
e、 数组是预先分配的单个连续元素块(所有元素类型相同),大小和位置固定,指针是内存中的一个位置,将另一个位置的地址保存在其中
所以当我们声明int*p=a
我们正在声明一个类型为int*
的新指针,并将其初始化为指向数组a
中的第一个元素。我们也可以这样做(相同):
int*p=&a[0]//指向数组a中的第一个元素
如果您想在屏幕上看到这是正确的,可以使用转换格式说明符%p
打印地址:
见下文:
printf(“%p==%p\n”,(void*)a,(void*)和a[0])代码>
你可以读这个。他们有很好的例子
要进一步了解数组和指针之间的关系,请重新访问此网站:
1. 在第一个示例中:
a
指向数组中的第一个整数(a的类型是int*
)
int*p=a
这里我们定义一个指针p
指向a
指向的点
在第二个示例中相同:
我们首先定义一个指针p
,然后将它分配给a
指向的点。指针是一个变量,它包含另一个变量在内存中的地址。我们可以有一个指向任何变量类型的指针。
*p-**p-***p-in-pointers第一个示例是初始化-在声明时设置p
的值。第二个示例是赋值-您将p
的值设置为独立操作
这两个语句具有相同的效果,因为它们将a
的第一个元素的地址分配给p
声明中的一元*
仅表示声明的对象具有指针类型-它没有执行解引用操作。初始值设定项是给p
赋值,而不是给*p
我想这里没有答案能真正解决您的困惑:*p
与p
您需要了解的是,*
有两种完全不同的含义,这取决于它的使用位置:
- 当它用作类型说明符的一部分时,它表示指针类型。例如,当您声明一个名为
p
的变量,其类型为指向int:int*p
。这里,*
是声明类型的一部分,表示指针类型
- 在表达式中使用时,它是解引用运算符。它是一个接受指针操作数的一元运算符,它访问在该地址找到的对象。例如,在类似
*p=24
的情况下
你说*p=a
和p=a
之间有什么区别,但这对于你的例子来说是一个错误的比较,因为你的中的*p
并不独立。我的意思是:
int * p = 24;
// ^~~~~ ^ ^----
// type | initializer
|
name of the variable
在上述情况下:
int*
是声明的符号类型李>
p
是所声明变量的名称
=24
是变量的初始值设定项
你看,在这里谈论*p
毫无意义
当*
是解引用运算符时,谈论*p
是有意义的。例如:
int a = 11;
int b = 17;
int* p = &a; // declare the variable named p of type `int*`
// and assign `&a` (aka the address of a) to it
// p points to the object a
*p = 3; // assign 3 to the object found in memory at the address denoted by p
// this effectively changes `a` to 3
p = &b; // assign the address of b to p. p is now a pointer pointing to the object b
*p = 24; // assign 3 to the object found in memory at the address denoted by p
// this effectively changes `b` to 24
int*p=a
完全等同于int*p;p=a
但它不等于int*p*p=a
@HolyBlackCat,我知道,但是它们之间有什么区别?(1)和(2)是等价的,它们允许您更改指针本身(即,选择它指向的变量)。(3) 用于指定指针当前指向的变量。它应该在任何半正版C++书籍中解释清楚……@ HOLYBLASCAT,我认为OP在指针中被<代码> */Cube混淆了。definition@HolyBlackCat,非常感谢,但是第三句话我不明白,你能解释一下吗。谢谢,你是说两个例子都一样吗?是的。如果我的回答对你有帮助,请投票支持我。@P________________________________________;和int*p=a@我已经解释过了。它是
int a = 11;
int b = 17;
int* p = &a; // declare the variable named p of type `int*`
// and assign `&a` (aka the address of a) to it
// p points to the object a
*p = 3; // assign 3 to the object found in memory at the address denoted by p
// this effectively changes `a` to 3
p = &b; // assign the address of b to p. p is now a pointer pointing to the object b
*p = 24; // assign 3 to the object found in memory at the address denoted by p
// this effectively changes `b` to 24