数组指针 和 指针数组

数组指针 和 指针数组,第1张

        在C语言中,指针是个神奇的东西,在window底层对指针的妙用无处不在。


这里来总结数组针指的小结。


在内存里面系统就是通过指针来寻找数组的每个元素的。




一、数组指针 1.一维数组:

数组指针:指向一个数组的指针。


int arr[]={1,2,3,4,5,6,7,8,9};

        这里有个整形数组 arr,这里我们知道arr是数组名,也是地址首元素的地址。


那么能不能定义一个指针来指向这个数组并调用数组里面的元素呢。


        其实是可以的。


那么指针的类型是什么样的呢。


我们定义指针的时候:

int a=10;
int* p=&a;
printf("%d",*p);

         这里p就是一个指向a地址的指针,取地址a (&a),取得的就是a的地址,解引用(*p)就是获得变量a上存的值。


        这里可以总结一个小规律,一个变量取地址(&)就相当于原来的类型加上一个*,一个指针解(*)引用就相当原来的类型减一个*。


        &a(取地址)的后获得的类型就是 int*,*p(解引用)后获得的类型是 int

那么对于数组来说也是一样的,把数组取地址(&arr),得到的类型是原类型加上一个*。


int (*arr)[];
//注意不是 int *arr[];

那么用来接受这个数组地址的类型也该是

int arr[10];
int (*p)[10]=&arr;

        这里指针p是一个指针,指向一个数组,数组的返回类型是int类,所以p就叫数组指针,表达了整个数组。


 PS:

int (*p1)[10];
int (*p2)[5];

         这里 [ ] 里面10跟5的差别很大,是10的时候 p+1,跳过数组的10个元素,是5的时候则跳过5个元素。


void print(int (*p)[10],int sz) //这种写法属于绕远路,一般写的少
{
	for(int i=0;i

         指针p解引用(*p),原类型去掉一个*,就是 int p[10],这里p就代表数组名,数组名就是首元素的地址。


所以解引用数组指针,就是数组首元素地址。


        那么 首元素地址再加上一个数 i,就能取到第i个元素的地址 *(*p+i )

        

PS:这里 p,&arr,arr的值是一样的,代表的含义不同。


 

数组名:

1.sizeof(arr) ,这里arr表示的是整个数组。


2.&arr,这里也是表示取的整个数组的地址。


然后其他的数组名,都是表示数组首元素地址。


* :虽然地址首元素的地址跟整个数组的地址是一样的,但是 首元素的地址+1,则跳到下一个元素,整个数组的地址+1,则跳过整个数组。


2.二维数组:

        对于二维数组来说,数组指针有又有些不同。


   

void print(int (*p)[3],int c,int r) 
{
	for(int i=0;i{1,2,3},{4,5,6},{7,8,9}};
print(arr,3,3);
//int (*p)[3][3],必须三行三列,才能接收二维数组arr

         在二维数组中 arr 代表的是第一行的地址,相当于*(arr+0)、arr[0]。


也叫行指针。


        会发现这里  int arr[3][3],跟上面的 int (*p)[3]  很相似。


所以这里的 arr也可以理解为一个数组指针指向数组的第一行。


        &arr[0][0],*(arr+0)+0,才是第一个元素的地址(地址是一样的,意义不同)。


             

         按照上面,arr取地址(&arr),原类型加一个*,int (*arr)[3][3],还是要注意不是int* arr[3][3],那么用来接收指向二维数组的指针的类型就是,int(*p)[3][3]。


        解引用p (*p) ,原类型减去一个*,就是 int p[3][3],这里的p代表的是数组第一行的地址,       *(p+i),就获得的是数组第i行首元素的地址,再解引用*(*p),原类型再减去一个*就是int p[3],这里的p就是首元素地址了,*(*(p+i)+j)获得的就是第几行第几个元素。


        这里有多中写法:1.p[ i ][ j ]        2.*( p + i ) [ j ]

         PS:这里的p[3][3],元素的个数必须跟二维数组一样。


 

         PS:理解去*,加*的时候,*是从变量名最近的*号开始的,也就是从最里面的*开始算。



二、指针数组

        那么为什么数组指针不能写成  int*arr[10],这种形式呢。


        因为这种数组代表的意义不同,此数组叫指针数组,意思是一个数组arr,有10个元素,每个元素的类型是 int* 的指针。


int a1,a2,a3;
int *p1=&a1;
int *p2=&a2;
int *p3=&a3;
int *arr[3]={p1,p2,p3};

指针数组也可以定义一个指向数组的指针:

        int* (*arr)[3];        二维数组: int* (*arr)[3][3];

        当然不管是在这里还是在上面,都还可以进行无限的套娃(加*),不过意义已经不大而且几乎使用不到,并且非常复杂。


 

对于指针数组来说,则就可以使用 int * *arr(二级指针)来接受数组。


void test(int* *p){ }

int *arr[3];
test(arr)  //不是&arr

但是为什么某些编译器或者网站则使用 int* * arr来接受二维数组呢?

其实它们不是标准的二维数组,只是二维数组的一个模拟


总结

        光是在数组里面的指针的意义和用法都多种多样,要熟练指针,多练习和运用。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://outofmemory.cn/langs/562282.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-04-01
下一篇2022-04-01

随机推荐

  • 怎么在税务网厅查询开票可开具发票品名?

    发票开具明细查询操作流程:一、登录电子税务局,依次点击【我要办税】-【发票使用】-【发票开具明细查询】,即可进入该界面。二、点击日期控件选择开票日期起止,输入销方识别号,点击【查询】,即可查看符合条件的发票开具明细信息。“一照一码”纳税人工

    2023-02-02
    000
  • 个人ip是什么意思呢

    个人ip意思是指个人对某种成果的占有权,在互联网时代,它可以指一个符号、一种价值观、一个共同特征的群体、一部自带流量的内容。个人ip是网络流行语,每个人都是产品,把自己当成这辈子最好的产品去打造。个人品牌就是最好的护城河,一旦打造出来,很难

    2023-02-02
    000
  • 山羊绒毛衣怎么洗

    请先查看衣物标签,如果山羊绒毛衣可以水洗,请按以下方法来清洗。1、洗涤前先拍去灰尘,然后在冷水中浸泡10-20分钟,(羊毛织物在30度以上的水溶液中会收缩变形,宜冷水短时间浸泡);2、再在放入蓝月亮丝毛净清洗液或蓝月亮洗衣液的水中轻轻揉搓衣

    2023-02-02
    000
  • 平方米和公顷的换算公式是什么?

    1公顷=10000平方米=0.01平方千米。1平方米=1.0×10-6平方千米=0.0001公顷。1平方千米=100公顷=1000000平方米。公顷(Hectare)为面积的公单位(国际单位)。一块面积一公顷的土地为10000平方米,

    2023-02-02
    000
  • 经常有人说的MMMMMMM是什么意思

    “MMMMMMM是指嗯嗯嗯……表示无语。或者惊讶等。 ”如:GG(哥哥)、JS(奸商)、PFPF(佩服佩服)、ZT(转贴)等,这类语言通常是提取中文词组的首个字母,比较容易理解和识别,所以能够被广泛采用传播。与它相似的还有以英语词组缩写或

    2023-02-02
    100
  • 指南针怎么画

    方法步骤:首先画出一个圆形。再画一个圆形。画出三段直线和两段曲线。请点击输入图片描述画出八段直线和一个圆形。写出四个字母。最后给画好的指南针涂色即可。指南针简笔画画法简单易学,本教程共有6步,非常适合小朋友们学习画画。想知道简笔画指

    2023-02-02
    000
  • 请问每100g里红薯粉的卡里路和热量分别是多少。

    每100g红薯粉的所含热量为336大卡 ,每500克红薯约可产热能635千卡,含蛋白质11.5克、糖14.5克、脂肪1克、磷100毫克、钙90毫克、铁2克,胡萝卜素0.5毫克,另含有维生B1、B2、C与尼克酸、亚油酸等。红薯粉可以做成红薯粉

    2023-02-02
    000
  • BUG是什么意思

    现在人们将在电脑系统或程序中,隐藏着的一些未被发现的缺陷或问题统称为bug(漏洞)。由于现代社会的发展,bug另有一种引申意义,用来形容某事物厉害的超乎想象,BUG可以使电脑系统崩溃、容易被施诈者攻击,现有修复漏洞的工具。扩展资料游戏中

    2023-02-02
    100
  • 最大的质数是多少?

    自然数的个数是无限的。合数一般以0、2、4、6、8结尾,所以合数要比质数非常非常多!所以质数肯定非常非常少!但是合数那么多,那么质数也那么多!所以最大的质数不存在!但是告诉你三件事:1、发现的最大质数是2^74207281-1!这个质数在2

    2023-02-02
    100

发表评论

登录后才能评论

评论列表(0条)