数组和指针的区别,指针数组和数组指针

1、首先我们都知道数组名相当于一个指针指向数组的第一个元素,但两者是某真正的相等呢?不是。

下面我们来看下他们的区别:数组名只是一个地址,而指针,是一个左值。

什么意思,看下面这段代码:

运行的结果是错误的,报错为:error: lvalue required as increment operand

#include <stdio.h>
#include <stdlib.h>
int main()
{
    char str[]="wochileyigexigua";
    int count=0;
    while(*str++ != '\0')//用++自增运算符在判断的时候,第一次循环不会自增
    {
        count++;
    }
    printf("字符长度为%d",count);
    return 0;
}

来看什么意义,字面说自增运算符需要一个左值。什么是左值,指的是一个可以识别或者定义的可改变的存储位置。

存储位置是没问题的,但可改变?不对,数组名是不可改变的。

所以说,我们不能直接用数组名,而应该直接用指针指向这个数组。

下面是正确的代码:

#include <stdio.h>
#include <stdlib.h>
int main()
{
    char str[]="wochileyigexigua";
    int count=0;
    char *pa=str;
    while(* pa++ != '\0')//用++自增运算符在判断的时候,第一次循环不会自增
    {
        count++;
    }
    printf("字符长度为%d",count);
    return 0;
}

2、指针数组:看名字,知道它是一个数组,值得就是用一个数组来存放指针(也就是地址)。

      int  *pl[5];由于[]的优先级比较高,所以先定义一个数组,然后这个数组里面存放指针。

      且每个指针都是指向一个整形变量的整形指针。

     看下面的例子:表示存指针(也就是地址)的数组

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int a=1;
    int b=2;
    int c=3;
    int d=4;
    int *pa[4]={&a,&b,&c,&d};
    for(int i=0;i<4;i++)
    {
        printf("%d\n",*pa[i]);
    }
    return 0;
}

再来看指针数组的常用方法:用指针数组来存储字符串,每个数组元素存的是字符串的第一个字符的首地址。

所以我们的指针数组的类型也就必须是char类型;

#include <stdio.h>
#include <stdlib.h>
int main()
{
    char *p[4]={"122","iijk","kjhkj","hjgj"};
    for(int i=0;i<4;i++)
    {
        printf("%s\n",p[i]);
        //之所以能打印出字符串而不是字符串首地址,是因为字符串存储都是这样,只用存储字符串的首地址就行,他会自动找到
    }
    return 0;
}

 

 

    

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值