const指针、数组指针、指针数组理解

本文深入探讨了C语言中指针与数组的高级应用,包括指针的三种不同形式及其意义,以及如何理解数组指针与指针数组的概念。通过实例解析,清晰展示了每种指针形式在实际编程中的用法与特性。

 指针中,关键字const放在不同的位置表示的意义:

1、const int *p;

    这种情况下,表示的是一个指向常量的指针,程序中不能通过指针来改变它所指向的值,但是指针本身的值可以改变,即指针可以指向其他的数据。就好像她,她就像冷血动物,她是那么的无情,不论我是多么的爱她,为她做多少的改变,又或者其他人对她的关心,她都没有感觉,她只顾她自己,或许我是该去寻找生命中的另外一个,结束这无尽的痛苦。

2、int * const p;

    这种情况下,声明一个指针常量(也称常指针)。指针本身的值不可变,即它不能再指向其他数据,但它所指向的数据的值可以改变。就好像我,我的心里只有她,一直都不会改变,你只要问我最爱的人是谁,一定是她。可是她的心我不懂,我不明白她的心里到底有没有我,还是到底她的心在想些什么,就算有一天,她离我而去,她的心里装着别人,我还是一样傻傻的坚持着。

3、const int * const p;

    这种情况声明一个指向常量的指针常量,指针本身的值不可改变,它所指向的数据的值也不能通过指针改变。就好像我们曾经的誓言,我的心里只有她,她的心里只有我,我们不离不弃,相濡以沫,天荒地老,海枯石烂,永不分离。

 

理解数组指针

#include<iostream.h>

void main()

{

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

       int i=1,j=1;

       int (*p)[3];

       p=a;

       int x = *(p[i]+j);

       int y = *(p+i)[j];

       cout<<x<<" "<<y<<endl;

}

 

x=5;y=7;

因为p是一个指向包含3个元素的以为数组的指针,p=p[0]=&a[0]=&{1,4,7}; p[i]=p[1]=&a[1]=&{2,5,7}; p[i]+j=p[1]+1=&5;

p=a[],a[][]=p[];方括号的优先级大于*号,所以y其实质是a[],而x实质是a[][];y=*(p+i+j)=*(p+2)=7; 

 

理解指针数组

#include<iostream.h>

void main()

{

       int a[5]={1,2,3,4,5};

       int (*pa)[5]=&a;

       cout<<"*pa[0]= "<<*pa[0]<<endl;

       cout<<"*(pa[0]+1)= "<<*(pa[0]+1)<<endl;

       cout<<"*(pa[1])= "<<*(pa[1])<<endl;

       char *pb[5]={"abc","def","123","456","789"};

       cout<<"pb[0]= "<<pb[0]<<endl;

       cout<<"pb[1]= "<<pb[1]<<endl;

}

*pa[0]= 1
*(pa[0]+1)= 2
*(pa[1])= 2367460
pb[0]= abc
pb[1]= def

这里因为int (*pa)[5] : pa是一个指向 int[5]的一个数组指针

*(pa[1])=*(*(pa+1));相当于把这个指针指的位置移动了一格。

pa指向的是一个数组,把数组整体当做一个元素来看,当指针的值改变的时候,那么所指向的值也肯定不是原来的这个数组了

 

int (*pa)[5]=&a;

如果是普通的指针,则初始化赋值的时候是赋值的这个数组中的第一个元素,

a是代表这个数组的起始位置的地址,比如a[0]

而数组指针初始化赋值需要赋的是整个数组在内存中的位置,&a是代表整个数组在内存中的位置,就把整个数组当做一个整体来看

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值