二、堂下练习
1、字符串与指针
请写出下列程序的运行结果
#include<stdio.h>
int main( )
{ char string[30]="How_are_you" ;
char *p=&string[0], *p2=string+8;
printf("%s,%s\n" , p , p2 ) ;
}
程序运行结果为:
#include <stdio.h>
int main()
{
printf("_______________________");
}
思路:*p作为指针声明符号,表名p是指针变量。当把一个变量的地址或者指针首地址赋值给p变量时,表示p的指针变量指向这个值。字符串是读取到结束为止。
答案:How_are_you,you
2、数组中的指针
问题:设有如下数组定义: int a[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}}; 计算下面各项的值(设数组a的首地址为2000,一个int类型数占四个字节)。
编写一个程序按要求一行一个输出。
(1)a[2][1] (2)a[1] (3)a (4)a+1
(5)*a+1 (6)*(a+1) (7)a[2]+1 (8)*(a+1)+1
(9)*(*(a+2)+2)
答案:
#include<stdio.h>
int main(){
printf("19\n");
printf("2016\n");
printf("2000\n");
printf("2016\n");
printf("2004\n");
printf("2016\n");
printf("2036\n");
printf("2020\n");
printf("21\n");
return 0;
}
分析:
数组: 数组下标:
1 3 5 7 00 01 02 03
9 11 13 15 10 11 12 13
17 19 21 23 20 21 22 23
(1)a[2][1]的值
(2)a[1],代表第二行的首地址,2000+4*4=2016
(3)a,代表a[0][0]的地址,2000
(4)a+1,代表a[1][0]的地址,2016
(5)*a+1,代表a[0][1]的地址,2000+4=2004
(6)*(a+1) ,代表a[1][0]的地址,2016
(7)a[2]+1 ,代表a[2][0]的地址的下一位,即a[2][1]的地址,2000+4*9=2036
(8)*(a+1)+1,*(a+1)为第二行的首地址即a[1][0],然后再把这个地址+1,即a[1][1]的地址,2016+4=2020
(9)*(*(a+2)+2),*(a+2)为a[2][0]的地址,*(a+2)+2为a[2][2]的地址,最外面加*,为a[2][2]的值21.