多维数组与指针:
以二维数组为例,二维数组可以说算是数组的数组。
定义 int a[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};
设二维数组的首行的首地址为2000,则有:
一维数组取出的值是二维数组的地址,二维数组取出的值才是它的值。
例题:输出与二维数组有关的值:
#include<stdio.h>
int main()
{
int a[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};
printf("a:%d\n",a);
printf("*a:%d\n",*a);
printf("a[0]:%d\n",a[0]);
printf("&a[0]:%d\n",&a[0]);
printf("&a[0][0]:%d\n",&a[0][0]);
printf("a+1:%d\n",a+1);
printf("*(a+1):%d\n",*(a+1));
printf("a[1]:%d\n",a[1]);
printf("&a[1]:%d\n",&a[1]);
printf("&a[1][0]:%d\n",&a[1][0]);
printf("a+2:%d\n",a+2);
printf("*(a+2):%d\n",*(a+2));
printf("a[2]:%d\n",a[2]);
printf("&a[2]:%d\n",&a[2]);
printf("&a[2][0]:%d\n",&a[2][0]);
printf("a[1]+1:%d\n",a[1]+1);
printf("*(a+1)+1:%d\n",*(a+1)+1);
printf("*(a[1]+1):%d\n",*(a[1]+1));
printf("*(*(a+1)+1):%d\n",*(*(a+1)+1));
}
结果如下:
把二维数组a分解为一维数组a[0],a[1],a[2]之后,设p为指向二维数组的指针变量。可定义为: int(*p)[4];
它表示p是一个指针变量,它指向包含4个元素的一维数组。若指向第一个一维数组a[0],其值等于a,a[0],或&a[0][0]等。而p+i则指向一维数组a[i]。
二维数组指针变量定义的一般形式为:类型说明符(*指针变量名)[长度];
例题:用指针变量输出二维数组元素的值:
#include<stdio.h>
int main()
{
int a[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};
int (*p)[4];
int i,j;
p=a;
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
{
printf("%2d ",*(*(p+i)+j));
}
printf("\n");
}
}
例题:利用指针变量通过输入指定行数和列数打印出二维数组对应元素的值:(这里的代码有纠错的功能,就是说如果输入的行数或列数超出了二维数组的范围,会让重新输入)
#include<stdio.h>
int main()
{
int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
int (*p)[4],i,j;
p=a;
printf("i = ");
scanf("%d",&i);
while(i>2||i<0)
{
printf("i = ");
scanf("%d",&i);
}
printf("j = ");
scanf("%d",&j);
while(j>3||j<0)
{
printf("j = ");
scanf("%d",&j);
}
printf("a[%d,%d] = %d\n",i,j,*(*(p+i)+j));
}
字符串与指针:
例题:定义一个字符数组,对它初始化,然后输出该字符串:
#include<stdio.h>
int main()
{
char string[]="I love China!";
printf("%s\n",string);
}
可以不定义字符数组,而定义一个字符指针。用字符指针指向字符串中的字符。
#include<stdio.h>
int main()
{
char *string="I love China!";
printf("%s\n",string);
}
字符串中字符的读取方法:
例题:将字符串a复制给字符串b:
方法一:下标法
#include<stdio.h>
int main()
{
char a[]="I very love China!",b[40];
int i;
for(i=0;*(a+i)!='\0';i++)
{
*(b+i)=*(a+i);
}
*(b+i)='\0';
printf("String a is: %s\n",a);
printf("String b is: ");
for(i=0;b[i]!='\0';i++)
{
printf("%c",b[i]);
}
}
方法二:指针方法
#include<stdio.h>
int main()
{
char a[]="I very love China!",b[40],*p1,*p2;
int i;
p1=a;
p2=b;
for( ;*p1!='\0';p1++,p2++)
{
*p2=*p1;
}
*p2='\0';
printf("String a is: %s\n",a);
printf("String b is: ");
for(i=0;b[i]!='\0';i++)
{
printf("%c",b[i]);
}
}
字符指针做函数参数:
用指针变量存放字符串,是直接将字符串的偏移地址赋值给指针变量
如果把字符串赋值给一个数组变量,是把字符串中的每一个值赋值给数组。
例题:用函数调用实现字符串的复制,有a,b两个字符串,将a字符串里的内容复制到b里:
方法一:用字符数组做参数:
#include<stdio.h>
int main()
{
void copy_string(char from[],char to[]);
char a[]="I am a student.";
char b[]="You are a student,too.";
printf("string a = %s\nstring b = %s\n",a,b);
printf("\ncopy string a to string b:\n");
copy_string(a,b);
printf("\nstring a = %s\nstring b = %s",a,b);
}
void copy_string(char from[],char to[])
{
int i=0;
while(from[i]!='\0')
{
to[i]=from[i];
i++;
}
to[i]='\0';
}
方法二:形参用字符指针变量:
#include<stdio.h>
int main()
{
void copy_string(char *from,char *to);
char *a="I am a student.";
char b[]="You are a student,too.";//b是被写的,所以不能用b[]
printf("string a = %s\nstring b = %s\n",a,b);
printf("\ncopy string a to string b:\n");
copy_string(a,b);
printf("\nstring a = %s\nstring b = %s",a,b);
}
void copy_string(char *from,char *to)
{
for( ;*from!='\0';from++,to++)
{
*to=*from;
}
*to='\0';
}
copy_string函数还有多种写法:
//方法一
void copy_string(char *from,char *to)
{
while((*to=*from)!='\0')
{
to++;
from++;
}
}
//方法二
void copy_string(char *from,char *to)
{
while((*to++ = *from++)!='\0')
{
;
}
}
//方法三
void copy_string(char *from,char *to)
{
while(*from!='\0')
{
*to++ = *from++;
}
*to='\0';
}
//方法四
void copy_string(char *from,char *to)
{
while(*to++ = *from++) //结束的标志是等于零的时候,'\0'==0
{
;
}
}
//方法五
void copy_string(char *from,char *to)
{
for( ;*to++ = *from++; )
{
;
}
}
//方法六
void copy_string(char from[],char to[])
{
char *p1,*p2;
p1=from;
p2=to;
while((*p2++ = *p1++)!='\0')
{
;
}
}