c语言数组指针加减指向的基础问题

首先需要明确的是几个基础问题
1.数组名代表的是数组的首地址

2.用指针指向数组的首地址两种方法
p = &a[0] 或者p=a 二者等价

3.指针赋值方式
int *p,*p1,*p2,i,a[20];

(1)p= &i; 完成的功能:将变量 i 的地址赋值给指针 p,即:p→i。
(2)p= a; 完成的功能:将数组 a 的首地址赋值给指针 p,即:p→a[0]。
(3)p= &a [i]; 完成的功能:将数组元素 a[i]的地址赋值给指针 p,即:p→a[i]。
(4)p1= p2; 完成的功能:将指针变量 p2 的值赋值给指针 p1,即:p1 与 p2 指向同一个地址。

指针的自增自减:
大致可以分为 8 种格式:
(1)指针变量++ 例如:p++;
(2)++指针变量 例如:++p;
(3)指针变量-- 例如:p–;
(4)–指针变量 例如: --p;
(5)指针变量*++ 例如:*p++;或 (*p) ++;
(6)++*指针变量 例如:++*p; 或 ++(*p);
(7)*指针变量-- 例如:*p–; 或 (*p) --;
(8)–*指针变量 例如: --*p; 或 --(*p);
注意:
这里的++,–代表的意思是增加一个单位,在指针左边代表先进行加减再运算算,在右边代表先进行运算再加减

下面讲解++,–同理;

预先定义基本的指针和数组:c语言数组指针加减指向的基础问题_第1张图片

1.p++:运算规则:先取 p 的值作为表达式的值,然后将 p 后移指向下一个内存单元。
c语言数组指针加减指向的基础问题_第2张图片

2.++p:运算规则:将 p 后移指向下一个内存单元,然后取 p 的值作为表达式的值。
c语言数组指针加减指向的基础问题_第3张图片
这里可能看不出来有什么区别,因为是单独作为语句,放在一起输出对比一下先后++的顺序就知道了

c语言数组指针加减指向的基础问题_第4张图片
5:
在这里插入图片描述
那为什么是5和2呢

  • p++代表的是p指向的下一个单元,之前因为int *p=a,p就是指向的a数组的首地址,p++指向的是a的第二个元素,也就是a[1],也就是定义的5;
    *(d)++等于2,是因为int *d=a,*d代表的是a[0]数值,数值++,就等价于数值+1,所以a[0]+1=1+1=2;

c语言数组指针加减指向的基础问题_第5张图片
为2的原因是p的指向是a[0]的值,也就是1,所以++的话就是a[0]+1=2;

这里补充一点,指针是可以改变数值的
具体举例子
这是两个都指向同一个数组的指针,改变两次++,加了两次1,所以是3在这里插入图片描述
要注意使用指针–的时候不要越界,a[0]这种已经是指针的首地址了,再减就要指向其他的地址就会出问题!!!!!!!!

运用指针的指向改变的数组,再次使用指针会保留上次的值,以上的例子只是单独使用,保证能理解基础。

附上完全代码和截图
#include
int main()
{
int a[]={1,5,9,13,17};
int *p=a;
int d=a;
/
//(1)指针变量++ 例如:p++;
cout< p++;
cout<

/* //(2)++指针变量 例如:++p;
cout< ++p;
cout<

/*
//(3)指针变量 例如:p–;
//(4)–指针变量 例如: --p;*/

///(5)指针变量++ 例如:*p++;或 (*p) ++;
*p++;
(*d)++;
cout<<*p<<" "<<d</

/* //(6)++*指针变量 例如:++*p; 或 ++(*p);
++*p;
++(*d);
cout<<*p<<" "<<d</

/*
//(7)*指针变量-- 例如:*p–; 或 (*p) --;
//(8)–*指针变量 例如: --*p; 或 --(p);/
}

c语言数组指针加减指向的基础问题_第6张图片

你可能感兴趣的:(数组,c语言)