数组与指针以及多级指针

指针操作数组

 

int arr[]={1,2,3,4,5,6,7};
//数组名是一个常量  不允许赋值`
//数组名是数组首元素地址
//arr=100; err
int* p;
p=arr;
printf("%p\n",p);
printf("%p\n",arr);
//输出的地址相同

for(int i=0;i<size;i++)
{
    printf("%d\n",*(arr+i)) 
    //arr为地址   *(arr+i)=arr[i]
    //p=arr    则可写成*(p+i)=p[i]
}

以上区别:指针p是变量,4个字节大小
数组arr是常量,40(4×10)个字节大小

 

指针运算


注意:指针运算不是简单的整数运算
指针类型+1     等同     内存地址+sizeof(指针类型)

void strcpy(char* dest,char* ch)
{
    while(*(ch+i))  
    //即while(*(ch+i)!='\0')  判断为真则进入循环
    {
        *(dest+i)=*(ch+i);
        i++;

        //可写为:
        //*dest=*ch;
        //dest++,ch++;
    }
    *(dest+i)=0;

    //*dest=0;
}

int main()
{
    char ch[]={"hello word"};
    char dest[];
    strcpy(dest,ch)
}


void strcpy(char* dest,char* ch)
{
    while(*dest++ = *ch++)
    //先赋值,再判断 
}

指针运算符操作中
指针+指针,指针×指针,指针×数字  都没有意义。

 

指针数组


数组的每个元素都是指针类型的数组。

1,定义:
数据类型  数据名[]={值1,值2,...,值3}

int a=10, b=20, c=30;
int* arr[3]={&a,&b,&c};
//arr[0]  arr[1]  arr[2]都是地址
printf("%d\n",*arr[0]);
//打印出10


指针数组大小:数据类型×4

2,用指针数组存储指针

int a[]={1,2,3};
int b[]={4,5,6};
int c[]={7,8,9};
int* arr[]={&a,&b,&c}

//arr[0]=a
for(int i=0;i<3;i++)
    for(int j=0;j<3;j++)
        printf("%d",arr[i][j]);   //等价*(*(arr+i)+j)

 

 

多级指针


二级指针就是指向一个一级指针变量地址的指针。若p为二级指针,则*p为一级指针。
*的作用为降级

int* arr[&a,&b,&c];
int** p=arr;

printf("%d\n",**p); //对应arr[0][0]

printf("%d\n",**(p+1));//对应arr[1][0]
//二级指针加偏移   相当于跳过了一个一维数组大小

printf("%d\n",*(*p+1))//对应arr[0][1]
//一级指针加偏移量  相当于跳过了一个元素

printf("%d\n",*(*(p+1)+1))
//先二级指针p加偏移量,跳过一个一维数组
//再一级指针*(p+1)加偏移量,跳过一个元素
//对应arr[1][1]

for(int i=0;i<3;i++)
    for(int j=0;j<3,j++)
        printf("%d\n",p[i][j]);
        //等价*(p[i]+j)=*(*(p+i)+j)


pp是二级指针的值      pp=&p
*pp是一级指针的值   *pp=p=&a
**pp是变量的值        **pp=*p=a=10

int a=10;
int b=20;
int* p=&a;
int** pp=&p;

**pp=100;  //改变的是**pp=*p=a中的10变为100
*pp=&b;  //改变的是*pp=p中存储的&a变为&b

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值