1.一维数组
数组:多个相同类型的变量被存储在一片连续的存储单元中
一.定义
当数组中每个元素只带一个下标时,称这样的数组为一维数组。
格式: 类型名 数组名【整型常量表达式】
如 int a[10]
1.数组名表示数组存储区的首地址.
2.数组元素的下标值由0开始,a[0],a[1],a[2],…,a[9]
3. c语言不允许定义动态数组,即数组的长度不能依赖运行过程中变化着的变量。例如:这样定义数组是不允许的
int i;
scanf("%d",&i);
int data[i];
4.在内存中给数组中每个成员开辟了一个存储单元.总计大小:10*4=40字节。这样每当调用数组中的一个成员就用他们的下标
二.一维数组元素的引用
格式: 数组[下标表达式]
其实x[0],x[j],x[j+k]都是对数组中元素的合法引用形式。但是需要注意的是下标表达式的值必须大于或等于0,并且小于数组上界的数
建立下面概念:
1.一个数组元素实质上就是一个变量名,代表内存中一个存储单元。一个数组占有一串连续的存储单元。
2.c语言规定数组名是一个地址常量,他代表整个数组的首地址
int *p; int a[10]; p=a(p=&a[0]);
a = = &a[0] 地址名也就是数组名不可被赋值 也就是说若a=10,一定是错误的
3.数组袁术下标表达式的值必须是整数
三.一维数组元素的初始化
1.当花括号的值少于数组元素个数时,将自动给数组后面元素赋值0,如
int a[10]={1};这个时候除了a[0]=1,其他的都是0;
对于字符型数组也是一样
char a[10]={'\0'};
不够的也会赋值'\0'
2.c语言规定,可以通过赋初值来定义数组的大小,这时数组说明符的一对方括号可以不指定数组的大小
如 int[]={1,1,1,1,1,1,1,1,1,1};
这样相当于数组中有了10个元素
3.举例
#include <stdio.h>
int main(void)
{
int a[10];
int i,*p;
p=&a[0];//或p=a;
for(i=0;i<10;i++)
scanf("%d",p++);
for(i=0;i<10;i++)
printf("a[%d]=%d\n",i,a[i]);
}
//通过键盘给数组a中的10个成员赋初值。
//指针并未移动,我们一直在改变a[0]的值
2.移动指针
所谓指针移动1就是对指针变量加上减去一个整数,或通过赋值运算,使指针变量指向相邻的存储单元。
对指针进行加减运算时,数字"1"不在代表十进制数1,而是指一个单位存储单元长度.这个单元多长,要看存储数据的类型了(因此只有指针指向一串连续的存储单元时,指针的移动才有意义
3.一维数组和数组元素的地址
一.前言:
定义的数组名可以认为是一个存放地址值的指针变量名.其中的地址值是数组第一个元素的地址,也就是数组所占一串连续储存单元的起始地址。重要的是:这个指针的地址值不可改变,也就是说,不可以给数组重新赋值。因此,也可以认为数组名是一个地址常量
如 float a[10],*p,x;
语句a=&x或a++这样的语句都是非法的,因为不能给a重新赋地址值。一旦定义a永远指向a数组的首地址
虽然不可以改变数组中a的内容,但可以对数组名加一个整数的办法,来依次表达该数组中不同元素的地址
如 int a[10],*p,p=a+4~~~~~~~p=&a[4]
再如
for(k=0;k<10;k++)
p=a+k;
在循环中并没有改变数组名a中的内容,但通过表达式:a+k逐一给出了a数组中每个元素的地址,使p依次指向a数组中的每一个元素。
如果要能类似上面的语句给数组中的元素赋值,语句为:
for(k=0;k<10;k++)
scnaf("%d",a+k);
通过数组的首地址引用数组元素
a是数组元素的首地址,a(即a+0)的值即等于&a[0],则用a+1的值等于&a[1]
数组a[0],可以用表达式*&a[0]来引用 * (a+0),还可用a[0]来表示。
但需要注意的是对于*(p+k)这样的表达式不能这样写*p+k,这样的意思为指针取值后加上k的值。
总结:数组元素s[i]的表达式应当有
s[i] *(s+i) *(p+i) *p[i]
二.实例
指针和一维数组相互替换
#include<stdio.h>
#include<string.h>
int main(void)
{
char *str="I love ying";
int length;
length=strlen(str);
for(int i=0;i<length;i++)
{
printf("%c",str[i]);
}
}
4.一维数组的指针表示
int a[10];
int *p;
p=&a[0];
注意
数组名a其实是个指针常量,一次不可赋值
- p=a; 和p=&a[0];是等价的,指针默认指向数组元素的首地址
可写成
int a[10];
int *p=a;
- 数组元素可以用下标a[i]表示,因此数组元素a[i]的地址可以表示为&a[i]或a+i那么形如*(a+i)是数组元素的指针表示法
归纳
- a[i]地址可表示为
&a[i] ,a+i, p+i
- a[i]本身表示为
*&a[i] ,*(a+i) ,*(p+i)
字符数组和指针实例
可类比c语言内部strlen函数 记得它要加头文件<string.h>
#include<stdio.h>
int main(void)
{
char str[]="I love ying";//数组名是个指针常量。不可修改
char *p=str; //转用指针变量指向数组。
int count=0;
while((*(p++)) !='\0')
{
count++;
}
printf("总共有%d个字符",count);
return 0;
}
5.指针数组和数组指针
1.指针数组
指针变量可以同其他变量一样作为数组的元素,由同类型的指针变量组成的数组称为指针数组
类型说明符 *数组名[数组长度]
[ ] 优先级高于 *
int *p[3] p先与[3]结合,表示p是一个数组,它有三个数组元素 ;再与 * 结合,表示数组的每个元素都是int *类型的 即数组元素都是整型指针变量
2.实例
#include<stdio.h>
int main(void)
{
int a=1;
int b=2;
int c=3;
int d=4;
int e=5;
int *p[5]={&a,&b,&c,&d,&e};
for(int i=0;i<5;i++)
{
printf("%d\n",*p[i]);
}
}