06-5 关于指针的几个例子

1、实现一个方法“多个返回值”的效果:返回数字的个位、十位、百位。

基于本程序的一些基本的c语法:

     '%'为取余运算符,用于把它前面的整数值或表达式除以
     其后面的整数值或表达式,结果为不能被后面的整数或表达
     式整除的最小整数,它后面的数值应该为大于1的正整数。如
     表中所示的"13%7",就表示13 除以7余6。

     ‘/' 是2目运算符,除法运算,整数除以整数则得整数

        '&'  取地址运算符,&a表示取变量a的地址;
'*'  指针运算符(取内容运算符)*p表示取p所指向的变量的内容
①先定义后赋值 int a=3,*p;(定义指针变量*p)
                         p=&a;(对指针变量取地址)
②定义变量的同时赋值  int a=3,*p=&a
也就是说在赋值时,int *p=&a
相当于            int *p;p=&a 
它们的区别其实就是:
int *p=&a是同时定义*p并对赋值p(即a的地址赋给P),
而p=&a,只是对P赋值,没有定义指针变量。
但要注意,只有在同时定义赋值时“*p=&a”这种写法才是对的
其他情况下不要用*p=&a,这种形式,

15ptrMultReturnValue.c

#include <stdio.h>
/*达到一个方法“多个返回值”的效果:返回数字的个位、十位、百位。*/
int parseGSB(int num,int *ge,int *shi,int *bai)
{
	if(num<0||num>999)
	{
		return 0;
	}
	//365: 个位365%10 = 5  //365整除10得到的余数
	//十位:(365/10)%10 = 6 
	//百位: (365/100)%10 = 3	
	*ge = num%10;
	*shi = (num/10)%10;
	*bai = (num/100)%10;
}
int main(int argc, char *argv[])
{	
	int i = 365;  //最大为999的一个数的个位、十位、百位数字
	int ge,shi,bai;
	if(parseGSB(i,&ge,&shi,&bai))
	{
		printf("%d,%d,%d",ge,shi,bai);
	}	
	return 0;
}

2、计算一个字符串的长度(null-terminated)

16ptrCalculStringLenth.c

#include <stdio.h>
/*计算一个字符串的长度(null-terminated)*/
int mystrlen(char *str)   //从首地址往后移,直到\0位置
{
	int len =0;
	while((*str)!='\0')   //注意此处不要写错应为\0,而不是/0
	{
		len++;
		str++;
	}
	return len;	
}
int main(int argc, char *argv[])
{
	int len = mystrlen("helloworld!");
	printf("%d",len);
	return 0;
}

3、判断一个字符串是否以另一个子子字符串结尾。代码见备注。

17ptrJudgeString.c

#include <stdio.h>
/*判断一个字符串是否以另一个子子字符串结尾。*/
int endsWith(char *str,char *substr)  //如果是则返回1,否则返回0
{
	/*
	程序思路:

	首先将指针从开始移动到最后,分别到两个字符串的最后一个字符,顺便计算
	两个字符串的长度,进行比对,如果子字符串(substr)长度比主字符串(str)长则返回0
	
	然后从两个字符串最后往前遍历比对,如果到最后都不等,即没有相同的字符则返回0,
	代表不是以该子字符串结尾;
	否则是以子字符串结尾的,返回1,代表是以子字符串substr结尾
	*/
	int strlen=0;       //定义变量,代表字符串的长度
	while(*str!='\0')   
	{
		str++;
		strlen++;
	}
	int substrlen=0;
	while(*substr!='\0')
	{
		substr++;
		substrlen++;
	}                     //
	if(substrlen>strlen)   //首先判断两个字符串的长度,如果子字符串
	{
		return 0;
	}
	int i;
	for(i=0;i<=substrlen;i++)     
	{
		/*
		从两个字符串最后往前遍历比对,如果到最后都不等,即没有相同的字符则返回0
		否则是以子字符串结尾的,返回1
		*/		
		char ch1 = *str;
		char ch2 = *substr;
		if(ch1!=ch2)         
		{	
			return 0;
		}
		str--;
		substr--;
	}
	return 1;
}
//  str1:"rupeng";  str2:"eng";   str3:"ing"
int main(int argc, char *argv[])
{
	printf("%d\n",endsWith("rupeng","eng"));
	printf("%d\n",endsWith("rupeng","ing"));
	printf("%d\n",endsWith("rupeng","rupenging"));
	return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值