C语言-指针移动只能是i++
#c语言##涨姿势#
①假设
#include < stdio.h>
main()
{int a[10],i=0;
while(i<10)scanf("%d",a+(i++));
或者
for(i=0;i<10;i++)scanf("%d",&a[i]);
以上两种数组遍历形式
都涉及指针移动,都含有i++
~
②a+(i++)
++在后,先运算,再加1
a+(i++)=a+i
a+(i++)=a+(i+1)
a+(i++)=a+(i+2)
…
a+(i++)=a+(i+9)
正好遍历a[0]、a[2]、…、a[9]
~
③&a[i++]
第二种形式i++在for语句中
a[i++]=a[i]
a[i++]=a[i+1]
a[i++]=a[i+2]
…
a[i++]=a[i+3]
正好遍历a[0]、a[2]、…、a[9]
~
④&a[i+1]
这不是指针移动
a[i+1]=a[i+1]
一是少输入了a[0]
二是指针没有移动,只是给每个元素赋值了
指针移动一定涉及地址移动,前一个地址等于后一个地址,此处a[i+1]与后一个地址没有联系
~
⑤a+i
这不是指针移动
a+i=a+i
虽然包含了a[0]
但是指针没有移动,只是给每个元素赋值了,前后地址没有联系。
~
⑥&a[++i]
++在后前,先加1,再运算
a[++i]=a[i+1]
a[++i]=a[i+2]
…
a[++i]=a[i+9]
少输入了a[0],不是完整的遍历
~
综上所述
指针移动,必需包含i++
![](https://wx3.sinaimg.cn/large/bcca76cfgy1gzqzeylkkdj20u00i5q3m.jpg)
#c语言##涨姿势#
①假设
#include < stdio.h>
main()
{int a[10],i=0;
while(i<10)scanf("%d",a+(i++));
或者
for(i=0;i<10;i++)scanf("%d",&a[i]);
以上两种数组遍历形式
都涉及指针移动,都含有i++
~
②a+(i++)
++在后,先运算,再加1
a+(i++)=a+i
a+(i++)=a+(i+1)
a+(i++)=a+(i+2)
…
a+(i++)=a+(i+9)
正好遍历a[0]、a[2]、…、a[9]
~
③&a[i++]
第二种形式i++在for语句中
a[i++]=a[i]
a[i++]=a[i+1]
a[i++]=a[i+2]
…
a[i++]=a[i+3]
正好遍历a[0]、a[2]、…、a[9]
~
④&a[i+1]
这不是指针移动
a[i+1]=a[i+1]
一是少输入了a[0]
二是指针没有移动,只是给每个元素赋值了
指针移动一定涉及地址移动,前一个地址等于后一个地址,此处a[i+1]与后一个地址没有联系
~
⑤a+i
这不是指针移动
a+i=a+i
虽然包含了a[0]
但是指针没有移动,只是给每个元素赋值了,前后地址没有联系。
~
⑥&a[++i]
++在后前,先加1,再运算
a[++i]=a[i+1]
a[++i]=a[i+2]
…
a[++i]=a[i+9]
少输入了a[0],不是完整的遍历
~
综上所述
指针移动,必需包含i++
![](https://wx3.sinaimg.cn/large/bcca76cfgy1gzqzeylkkdj20u00i5q3m.jpg)
T003 每日一题 反顺序输出链表值到数组中:可以用递归和栈实现;ArrayList是动态数组;数组Array类元素类型必须一致,创建时必须指定大小且是固定的,可以支持一维、二维和多维;而ArrayList类相当于一维数组,不支持多维数组,可以存储不同类型的元素,创建时可以不指定大小,使用过程中容量可以根据需要自动扩充;java中定义数组时可以不指定长度:例如 int[] a;(c这样做无法通过编译)但是要把它初始化成为一个真正意义上的数组就必须设定长度: int [] a = new int[10]; 这时就只能改变数组里的数值而不能改变它的长度了;时间0ms定义数组的方法很神,不需要重新遍历ArrayList,直接得到数组,没有创建动态数组,少了倒数据的过程;第一种的做法是先定义动态数组把链表中的值记录下来,再倒在数组里,不够简洁;用栈实现就是利用栈先进后出的特性,把链表中的值压到栈里,再弹到数组中。
![](https://wx1.sinaimg.cn/large/0074X43qly1gzpwvqraz5j30jq0i3jwk.jpg)
![](https://wx1.sinaimg.cn/large/0074X43qly1gzpwvqraz5j30jq0i3jwk.jpg)
C语言-二维数组的3个层面
#c语言##二维数组#
①假设
存在二维数组int a[2][3]
2行3列共6个元素
a[0][0],a[0][1],a[0][2]
a[1][0],a[1][1],a[1][2]
下面从三个层面分析二维数组
~
②int层面(元素)
二维数组有6个元素,
每个元素都是int型
~
③int*层面(列指针)
列指针是每个元素的地址
~
第一行元素
a[0][0],a[0][1],a[0][2]
第一行列指针
a[0],a[0]+1,a[0]+2
a[0]为第一行首地址,是数组名。
~
第二行元素
a[1][0],a[1][1],a[1][2]
第二行列指针
a[1],a[1]+1,a[1]+2
a[1]为第二行首地址,也是数组名。
~
指针数组*p[2]
指针数组表示每个元素为指针的数组
与二维数组的行长度相同
*p[2]含有2个指针元素
列指针a[0],a[1]
即
指针数组是列指针层面的
每行的首地址组成的数组。
~
④int**层面(行指针)
行指针是每行列指针的地址
~
第一行列指针(1行视为1个元素)
a[0],a[0]+1,a[0]+2
第一行行指针
a
~
第二行列指针(1行视为1个元素)
a[1],a[1]+1,a[1]+2
第二行行指针
a+1
~
数组指针(*p)[3]
数组指针表示指向数组的指针
与二维数组的列长度相同
(*p)[3]表示
指针指向的数组含有3个元素
行指针a,a+1
a(含a[0],a[0]+1,a[0]+2)
a+1(含a[1],a[1]+1,a[1]+2)
即
数组指针是行指针层面的,
可以说数组指针=行指针。
~
由于
行指针→列指针→元素
所以
行指针又称为指向指针的指针。
~
就这么简单,
你学废了吗?
![](https://wx3.sinaimg.cn/large/bcca76cfgy1gzdgdfu0x1j20u00i9wev.jpg)
#c语言##二维数组#
①假设
存在二维数组int a[2][3]
2行3列共6个元素
a[0][0],a[0][1],a[0][2]
a[1][0],a[1][1],a[1][2]
下面从三个层面分析二维数组
~
②int层面(元素)
二维数组有6个元素,
每个元素都是int型
~
③int*层面(列指针)
列指针是每个元素的地址
~
第一行元素
a[0][0],a[0][1],a[0][2]
第一行列指针
a[0],a[0]+1,a[0]+2
a[0]为第一行首地址,是数组名。
~
第二行元素
a[1][0],a[1][1],a[1][2]
第二行列指针
a[1],a[1]+1,a[1]+2
a[1]为第二行首地址,也是数组名。
~
指针数组*p[2]
指针数组表示每个元素为指针的数组
与二维数组的行长度相同
*p[2]含有2个指针元素
列指针a[0],a[1]
即
指针数组是列指针层面的
每行的首地址组成的数组。
~
④int**层面(行指针)
行指针是每行列指针的地址
~
第一行列指针(1行视为1个元素)
a[0],a[0]+1,a[0]+2
第一行行指针
a
~
第二行列指针(1行视为1个元素)
a[1],a[1]+1,a[1]+2
第二行行指针
a+1
~
数组指针(*p)[3]
数组指针表示指向数组的指针
与二维数组的列长度相同
(*p)[3]表示
指针指向的数组含有3个元素
行指针a,a+1
a(含a[0],a[0]+1,a[0]+2)
a+1(含a[1],a[1]+1,a[1]+2)
即
数组指针是行指针层面的,
可以说数组指针=行指针。
~
由于
行指针→列指针→元素
所以
行指针又称为指向指针的指针。
~
就这么简单,
你学废了吗?
![](https://wx3.sinaimg.cn/large/bcca76cfgy1gzdgdfu0x1j20u00i9wev.jpg)
✋热门推荐