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;
}