指针
今日份复习一维数组与指针、二维数组与指针、字符串与指针以及指针数组。
- 一维数组与指针定义一维数组时,系统会在内存中为其分配一段存储空间,数组名就是数组在内存中的首地址。若再定义一个指针变量,并将数组的首地址传给指针变量,则该指针就指向了这个一维数组。
表示将数组首地址赋给指针变量的两条语句:
p=&a[0];
q=b;
其中,p+n与a+n都表示数组元素a[n]的地址,即&a[n]。*(p+n)和*(a+n)都表示数组元素a[n]。表示指针的移动可以使用“++”和”—“(两个减号)这两个运算符。
如果在给数组元素赋值时使用了指针的自增运算,而且在输出数组元素时也使用指针变量,则需要加上以下语句:
p=a;
q=b;
这两句的作用是将指针变量p和q重新指向数组a和数组b在内存中的起始位置。
【例】一维数组指针的用法
#include <stdio.h>
void main()
{
int *p,*q,a[5],b[5],i;
p=&a[0];
q=b; //给指针赋值
printf("请输入a的值:\n");
for(i=0;i<5;i++)
{
scanf("%d",&a[i]);
}
printf("请输入b的值:\n");
for(i=0;i<5;i++)
{
scanf("%d",&b[i]);
}
数组a的值为:\n");
for(i=0;i<5;i++)
{
printf("%5d",*(p+i));
}
printf("\n");
数组b的值为:\n");
for(i=0;i<5;i++)
{
printf("%5d",*(q+i));
}
printf("\n");
}
结果为: - 二维数组与指针对于一个m行n列的二维数组,其元素地址的表示方法为:
- a表示二维数组的首地址,也表示数组第1行的首地址。a+m表示第m+1行的首地址。
- &a[m]+n表示数组第m+1行第n+1列的地址。
- &a[0]表示数组第一行的首地址,&a[m]表示数组第m+1行的首地址。
- &a[0][0]既可以表示数组第一行第一列的首地址也可以看作整个数组的首地址。
- *(*(a+m)+n)和*(a[m]+n)含义相同,都表示数组第m+1行第n+1列元素。
也可以采用*(a+i)+j输入和输出二维数组。
【例】输出一个三行五列的矩阵
#include <stdio.h>
int main()
{
int a[3][5],i,j;
printf("请输入元素:\n");
for(i=0;i<3;i++)
{
for(j=0;j<5;j++)
{
scanf("%d",&a[i][j]);
}
}
printf("该三行五列的矩阵为:\n");
for(i=0;i<3;i++)
{
for(j=0;j<5;j++)
{
printf("%5d",*(a[i]+j));
}
printf("\n");
}
}
结果为:
- 字符串与指针字符数组是一个一维数组,而字符串数组是以字符串作为数组元素的数组,可以看作一个二维数组。可以通过两种方式访问一个字符串:一是使用字符数组,二是使用字符指针。
【例】实现字符串的复制功能
#include <stdio.h>
void _strcopy(char *str1,char *str2);
int main()
{
char str1[]="你是正常人";
char str2[]="";
_strcopy(str1,str2);
printf("复制之后的字符串为:%s\n",str2);
return 0;
}
void _strcopy(char *str1,char *str2)
{
while (*str1!='0')
{
*str2=*str1;
str1++;
str2++;
}
*str2='0';
}
结果为: - 指针数组
指针数组,其元素均为指针类型数据。指针数组中的每一个元素都相当于一个指针变量。
指针数组使每个指针指向所需要的字符常量。这种方法需要在数组中保存字符指针,其占用空间远小于字符串数组占用空间。
【例】写出语文,数学,英语,化学,生物,物理的英文。
#include <stdio.h>
int main()
{
int i;
char *test[]={
"Chinese",
"math",
"English",
"chemistry",
"biology",
"physics"};
printf("答案是:\n");
for(i=0;i<6;i++)
printf("%s\n",test[i]);
return 0;
}
结果为: