指针是C语言的利器,学好后编程功力大增。先练习一个演示程序:
#include<stdio.h>
int main()
{
int a[4]= {1,2,3,4};
char s[]="ABCDEFG";
int *p;
char *q;
int (*m)[2];
char (*n)[2];
p=(int*)s; //int*型指针p指向字符数组s
printf("%x\n",*p); //*p取sizeof(int)个字节,分别是字符'D'、'C'、'B'、'A'的值
printf("%s\n",(char*)(p+1)); // p+1指向'E',因为p是int*型,偏移单位是sizeof(int) 即4个字节
q=(char*)a; //char*型指针q指向整型数组a
printf("%x,%x,%x,%x\n",*q,*(q+1),*(q+2),*(q+3)); //*q等每次只取1个字节,连续取4次,正好对应a[0]
q=(char*)(a+1); //a+1指向a[1],即2
printf("%x,%x,%x,%x\n",*q,*(q+1),*(q+2),*(q+3)); //取出a[1]对应的4个字节内容
m=(int (*)[2])a; //行指针m指向a
printf("%d,%d\n",*(int*)m,*(int*)(m+1)); //m+1指向a[2],即3
n=(char(*)[2])s; //行指针n指向s
printf("%s,%s\n",n,n+1); //n+1指向s[2],即'C'
return 0;
}
输出:
44434241
EFG
1,0,0,0
2,0,0,0
1,3
ABCDEFG,CDEFG
下面的程序,利用指针输出由*组成的图形:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>
#define N 5
#define BUFFERSIZE 2*N
char *image,*space;
void singleprint(int n,int nspace,int nmul1,int nimage,int nmul2) {
printf("%s",space+BUFFERSIZE-(nmul1*n+nspace));
printf("%s",image+BUFFERSIZE-(nmul2*n+nimage));
printf("\n");
}
void print(int n,int nspace,int nmul1,int nimage,int nmul2) {
for(int i=1; i<=N; i++)
singleprint(i,nspace,nmul1,nimage,nmul2);
}
int main() {
image=(char *)malloc(BUFFERSIZE+1);
memset(image,'*',BUFFERSIZE);
*(image+BUFFERSIZE)='\0';
space=(char *)malloc(BUFFERSIZE+1);
memset(space,32,BUFFERSIZE);
*(space+BUFFERSIZE)='\0';
print(N,-1,1,0,1);
printf("\n");
print(N,5,-1,-1,2);
printf("\n");
print(N,-1,1,11,-2);
free(image);
free(space);
return 0;
}
程序输出以下图形:
输出函数也可以换一种思路,通过加入临时换行符来实现:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>
#define N 5
#define BUFFERSIZE 2*N+1
char *image,*space;
void print(int n,int nspace,int nmul1,int nimage,int nmul2) {
for(int i=1; i<=N; i++) {
*(space+nmul1*i+nspace)='\0';
printf("%s",space);
*(space+nmul1*i+nspace)=32;
*(image+nmul2*i+nimage)='\0';
printf("%s",image);
*(image+nmul2*i+nimage)='*';
printf("\n");
}
}
int main() {
image=(char *)malloc(BUFFERSIZE+1);
memset(image,'*',BUFFERSIZE);
space=(char *)malloc(BUFFERSIZE+1);
memset(space,32,BUFFERSIZE);
print(N,-1,1,0,1);
printf("\n");
print(N,5,-1,-1,2);
printf("\n");
print(N,-1,1,11,-2);
free(image);
free(space);
return 0;
}
注意,在输出一行字符后,需要进行字符还原。
上面的程序还可以简化,思路是:将需要输出的空格及星号存到一个缓存中,最后一次性输出,代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>
#define N 5
#define BUFFERSIZE N*N
char *buffer;
char *p;
void print(int n,int nspace,int nmul1,int nimage,int nmul2) {
if(n==N) {
p=buffer;
memset(p,0,BUFFERSIZE);
}
memset(p,32,nmul1*(N-n+1)+nspace);
p+=nmul1*(N-n+1)+nspace;
memset(p,'*',nmul2*(N-n+1)+nimage);
p+=nmul2*(N-n+1)+nimage;
if(n==1) {
*p='\0';
printf("%s\n",buffer);
} else {
*p='\n';
p++;
print(n-1,nspace,nmul1,nimage,nmul2);
}
}
int main() {
buffer=(char *)malloc(BUFFERSIZE);
print(N,-1,1,0,1);
printf("\n");
print(N,5,-1,-1,2);
printf("\n");
print(N,-1,1,11,-2);
free(buffer);
return 0;
}