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)
即
数组指针是行指针层面的,
可以说数组指针=行指针。
~
由于
行指针→列指针→元素
所以
行指针又称为指向指针的指针。
~
就这么简单,
你学废了吗?
#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)
即
数组指针是行指针层面的,
可以说数组指针=行指针。
~
由于
行指针→列指针→元素
所以
行指针又称为指向指针的指针。
~
就这么简单,
你学废了吗?
C语言-指针指向地址的两种表达
#c语言#
①引子
众所周知
p=&x,表示地址
*p=x,表示值
但是
我们常常看见*p=&x
难道值=地址?
当然不等
前面还有个类型名int
即int *p=&x就是p=&x
可以理解为int *(p=&x)
本质是
int *p=int *&x=int x=x,表示值。
~
②p=&x,表示地址
#include< studio.h>
viod fun(int*a,int*b)
{
int w;
*a=*a+*a;/*a的值翻倍*/
w=*a;*a=*b;*b=w;/*交换ab的值*/
}
main()
{int x=2,y=3;
p=&x;q=&y;
/*用分号隔开了,前面没有int,表地址*/
fun(p,q);
printf("%d,%d\n",x,y);
}
计算结果
x=2x=4,y=3
再交换得x=3,y=4
~
③int *p=&x,也表示地址
#include< studio.h>
viod fun(int*a,int*b)
{
int w;
*a=*a+*a;/*a的值翻倍*/
w=*a;*a=*b;*b=w;/*交换ab的值*/
}
main()
{int x=2,y=3,*p=&x;*q=&y;
/*用逗隔开,前面有int,也表地址*/
fun(p,q);
printf("%d,%d\n",x,y);
}
计算结果
x=2x=4,y=3
再交换得x=3,y=4
#c语言#
①引子
众所周知
p=&x,表示地址
*p=x,表示值
但是
我们常常看见*p=&x
难道值=地址?
当然不等
前面还有个类型名int
即int *p=&x就是p=&x
可以理解为int *(p=&x)
本质是
int *p=int *&x=int x=x,表示值。
~
②p=&x,表示地址
#include< studio.h>
viod fun(int*a,int*b)
{
int w;
*a=*a+*a;/*a的值翻倍*/
w=*a;*a=*b;*b=w;/*交换ab的值*/
}
main()
{int x=2,y=3;
p=&x;q=&y;
/*用分号隔开了,前面没有int,表地址*/
fun(p,q);
printf("%d,%d\n",x,y);
}
计算结果
x=2x=4,y=3
再交换得x=3,y=4
~
③int *p=&x,也表示地址
#include< studio.h>
viod fun(int*a,int*b)
{
int w;
*a=*a+*a;/*a的值翻倍*/
w=*a;*a=*b;*b=w;/*交换ab的值*/
}
main()
{int x=2,y=3,*p=&x;*q=&y;
/*用逗隔开,前面有int,也表地址*/
fun(p,q);
printf("%d,%d\n",x,y);
}
计算结果
x=2x=4,y=3
再交换得x=3,y=4
C语言-指针移动与变量加减
#c语言#
①例子
先定义数组
int a[3]={10,20,30};
即a[0]=10,a[1]=20,a[2]=30。
再令指针p指向数组a首地址,
int *p=&a[0];
即*p=10
~
②指针移动(地址移动)
指针的移动=存储空间的移动
~
*p++
表示先++再*,即先移动再取值。
移动即p++=&a[0],
取值即*p++=10
++在后表示先原值运算,再加一。
++在后,p++影响p,即p++不变,p变。
p=&a[1],*p=20
~
*++p
表示先++再*,即先移动再取值。
移动即++p=&a[1],
取值即*++p=20
++在前表示先加一,再运算。
++在前,++p影响p,即++p和p都变。
p=&a[1],*p=20
~
③变量加减
变量的加减=原存储空间里的值的加减
~
++*p
表示先*再++,即先取值再变量加减。
取值即*p=*&a[0]=a[0]=10
变量加减即++*p=a[0]=10+1=11
即存储空间a[0]里的值本身变成11
++在前表示先加一,再运算。
++在前,++*p影响*p,即++*p和*p都变。
p=&a[0],*p=a[0]=10+1=11
#c语言#
①例子
先定义数组
int a[3]={10,20,30};
即a[0]=10,a[1]=20,a[2]=30。
再令指针p指向数组a首地址,
int *p=&a[0];
即*p=10
~
②指针移动(地址移动)
指针的移动=存储空间的移动
~
*p++
表示先++再*,即先移动再取值。
移动即p++=&a[0],
取值即*p++=10
++在后表示先原值运算,再加一。
++在后,p++影响p,即p++不变,p变。
p=&a[1],*p=20
~
*++p
表示先++再*,即先移动再取值。
移动即++p=&a[1],
取值即*++p=20
++在前表示先加一,再运算。
++在前,++p影响p,即++p和p都变。
p=&a[1],*p=20
~
③变量加减
变量的加减=原存储空间里的值的加减
~
++*p
表示先*再++,即先取值再变量加减。
取值即*p=*&a[0]=a[0]=10
变量加减即++*p=a[0]=10+1=11
即存储空间a[0]里的值本身变成11
++在前表示先加一,再运算。
++在前,++*p影响*p,即++*p和*p都变。
p=&a[0],*p=a[0]=10+1=11
✋热门推荐