一个变量有地址,一个数组也有地址,不同的是数组包含若干个元素,也对应的也就包含着若干个地址,并且这些地址是连续的,而且数组名就是这若干个连续地址的第一个地址。
一维数组整型类(int)
通过指针变量指向一个一维 int 类型数组元素:
int a[5]={0,1,2,3,4}; //定义一个数组名为 a 长度为5 的int类型变量
int *pa; //定义一个变量名为pa的int类型指针变量。
pa = &a[0]; //让指针变量pa指向数组a的a[0]元素
pa = &a[2]; //让指针变量pa指向数组a的a[2]元素
在一维数组中,变量名就是一维数组若干个连续元素的首地址,如下:
int a[5]={0,1,2,3,4}; //定义一个数组名为 a 长度为5 的int类型变量
int *pa; //定义一个变量名为pa的int类型指针变量。
pa = &a[0]; //让指针变量pa指向数组a的a[0]元素
pa = a; //等价于pa = &a[0]; 都是把数组a的首地址赋值给指针变量pa
指向一维数组的指针变量运算:
int a[5]={0,1,2,3,4}; //定义一个数组名为 a 长度为5 的int类型变量
int *pa0=a; //等价于pa = &a[0]; 都是把数组a的首地址赋值给指针变量pa
int *pa3=&a[3]; //让指针变量pa指向数组a的a[3]元素
//如果存在以上定义,则以下都是合法的。
pa0+1; //让pa0指向的地址+1,则表示移动到下一个连续的元素地址&a[1]
pa0++; //让pa0指向的地址+1,等价于pa0+1则表示移动到下一个连续的元素地址&a[1]
pa3-1; //让pa3指向的地址-1,则表示移动到上一个连续的元素地址&a[2]
pa3++; //让pa3指向的地址+1,则表示移动到下一个连续的元素地址&a[4]
pa3-pa0; //pa3-pa0则表示连个地址之差,可求出长度。
Note:
在使用一维数组运算时必须注意:pa++不能超出数组边界。因为我们无法预知素组a[4]元素之后的地址中保存什么样的数据。pa--不能超出数组边界。因为我们无法预知素组a[0]元素之前的地址中保存什么样的数据。pa3-pa2; 这两个指针变量必须保证都指向了同一个一维数组中的数组元素才有意义。
指针操作 | 数组操作 | 说明 |
array | &array[0] | 数组首地址 |
*array | array[0] | 数组首元素 |
array + i | &array[i] | 数组第 i 个元素地址 |
*(array +i) | array[i] | 数组第 i 个元素 |
*array + b | array[0] + b | 数组首元素地址 + b |
*(array + i) + b | array[i] + b | 数组第 i 个元素 + b |
*array++ | array[i++] | 先取得第i个元素的值,再使i加1 |
*++array | array [++i] | 先将i加1再取第i个元素 |
*array-- | array[i--] | 先取得第i个元素的值,再使i减1 |
*--array | array[--i] | 先将i减1再取第i个元素 |
指向一维数组指针操作
int a[5]={0,1,2,3,4}; //定义一个数组名为 a 长度为5 的int类型变量
int *pa0=a; //等价于pa = &a[0]; 都是把数组a的首地址赋值给指针变量pa
int *pa3=&a[3]; //让指针变量pa指向数组a的a[3]元素
//如果存在以上定义,则以下都是合法的。
*(pa0+2); //让pa0指向的地址+1,则表示a[2]元素。
*(pa0+i); //让pa0指向的地址+1,则表示a[i]元素。
例程(一维数组int类型)
//下标法
#include<stdio.h>
int main()
{
int a[5];
int i;
printf("请输入5个int类型的数字");
for(i=0;i<5;i++)
{
scanf("%d",&a[i]);
}
printf("以下输出刚刚输入的5个数字\n");
for(i=0;i<5;i++)
{
printf("a[%d] = %d\n",i,a[i]);
}
return 0;
}
//通过数组名查找地址操作数组元素
#include<stdio.h>
int main()
{
int a[5];
int i;
printf("请输入5个int类型的数字");
for(i=0;i<5;i++)
{
scanf("%d",&a[i]);
//以下也是合法的
//scanf("%d",(a+i));
}
printf("以下输出刚刚输入的5个数字\n");
for(i=0;i<5;i++)
{
printf("a[%d] = %d\n",i,*(a+i));
}
return 0;
}
//通过指针变量操作数组元素
#include<stdio.h>
int main()
{
int a[5];
int i;
int *pa;
printf("请输入5个int类型的数字");
for(pa=a;pa<(a+5);pa++)
{
scanf("%d",pa);
}
/***********************
for(i=0;i<5;i++)
{
scanf("%d",pa++);
}
***********************/
/*****************
注意,如果再次使用pa时一定要重新将pa=a;
另外这里是不可以使用a++,因为a代表数组首地址,它是一个指针常量,是不可以被改变的。
*******************/
printf("以下输出刚刚输入的5个数字\n");
i=0;
for(pa=a;pa<(a+5);i++,pa++)
{
printf("a[%d] = %d\n",i,*pa);
}
/***************
pa=a;
while(pa<a+5)
{
printf("%d\n",*pa);
pa++;
//printf("%d\n",*pa++);
//*pa++ 则表示先引用pa的值再使pa++.
}
**********************/
return 0;
}
一维数组名做为函数参数(int类型)
//通过数组名作为函数参数传递
#include<stdio.h>
/*********************
功能:排序由小到大;
参数1:目标数组
参数2:数组长度
**********************/
//这样写也可以,但是一般不这样写
//void arrSortUp(int *arr,int n)
void arrSortUp(int arr[],int n)
{
int k=0,j=0;
for(k=0;k<n-1;k++)
{
for(j=0;j<n-k-1;j++)
{
if(arr[j]>arr[j+1])
{
arr[j] = arr[j]+arr[j+1];
arr[j+1] = arr[j]-arr[j+1];
arr[j] = arr[j]-arr[j+1];
}
}
}
}
int main()
{
int a[5]={2,1,5,4,3};
int i;
printf("以下输出源数组的5个数字\n");
for(i=0;i<5;i++)
{
printf("a[%d] = %d\n",i,*(a+i));
}
//调用排序方法
arrSortUp(a,5);
printf("以下输出排序后的5个数字\n");
for(i=0;i<5;i++)
{
printf("a[%d] = %d\n",i,*(a+i));
}
return 0;
}