C 数组和指针算法

C 数组和指针算法,c,arrays,pointers,C,Arrays,Pointers,假设一个数组inta[10] 为什么我们不能做a=a+1?但指针变量也是如此 int *ptr = a; ptr = a+1; 这两种情况实际上是如何看待的?因为阵列位置是恒定的 不能更改a的值,因为它表示数组的起始地址。移动它没有任何意义 带int*ptr您的变量ptr只是一个指针,当然可以设置为指向您喜欢的任何地方 这里没有矛盾。这有点像函数,函数的名称计算为它的地址(称为“函数指针”),但也不能分配给它。如果数组是函数参数,则可以 #include <stdio.h>

假设一个数组
inta[10]

为什么我们不能做
a=a+1
?但指针变量也是如此

int  *ptr = a;

ptr = a+1;

这两种情况实际上是如何看待的?

因为阵列位置是恒定的

不能更改
a
的值,因为它表示数组的起始地址。移动它没有任何意义

int*ptr
您的变量
ptr
只是一个指针,当然可以设置为指向您喜欢的任何地方

这里没有矛盾。这有点像函数,函数的名称计算为它的地址(称为“函数指针”),但也不能分配给它。

如果数组是函数参数,则可以

#include <stdio.h>

int rval(int a[10]) {
    a = a + 1;
    return a[0];
    }

int main(){
    int a[10] = {0,1,2,3,4,5,6,7,8,9};
    printf ("%d\n", rval(a));
    return 0;
}

因为数组名是指向其第一个元素的常量指针。您不能更改常量变量的值,即const关键字的用途

int a[10];      //here a (array variable is Const i,e you Cannot a=a+1)
int* const p=&a[0]; //here Also Same,Now p is Const i,e you Cannot p=p+1.
但在这里:

int* pp=&a[0];//Here pp=pp+1 will work, Because pp is not Const.

我们无法移动“a”数组在内存中的位置。但是,我们可以将指向该数组的外部指针更改为指向数组的第二个元素,因为数组和指针是不同的。当然,函数参数不是数组,而是指向数组的指针的副本。指针副本可以更改,但不能更改memoryAgreed中数组开头的实际位置,但它回答了问题。您好,但当我们将数组传递给函数时,它会自动转换为指针。因此它会很好。对吗?在这种情况下,
a
不是数组,而是指针。“数组名称是常量指针”-不,这是一个数组。它不能改变的事实并不意味着它是
常量
。它在内部就像一个常量,这是因为它应该始终代表它的第一个元素的基址。我对此非常确定。我知道你对此很确定,但你仍然错了。我想说的是,它不是一个
const
指针。
const
指针看起来像
int*const p。数组是数组,不是指针。它不能修改,但不是因为它是一个
常量,而是因为它是一个数组。
const
s和数组都不能修改,但这并不意味着不能修改的东西就是
const
int* pp=&a[0];//Here pp=pp+1 will work, Because pp is not Const.