编程思维训练8:玩转指针1

本文通过两个C语言程序实例,展示了指针在处理数组和字符串时的用法,以及如何利用指针创建和输出由星号(*)组成的图形。第一个程序解释了不同类型指针对内存的访问方式,第二个程序则演示了动态构建和输出图形的技巧,涉及内存分配、字符串操作和递归。
摘要由CSDN通过智能技术生成

指针是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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丁亚涛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值