C 在指针中*p=var和p=var有什么不同?

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[

我在学习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[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