const常量,数组,字符串常量的值交换
小伙伴们在刷题的时候,会大量遇到值交换的问题。常常让人摸不着头脑,因为不同的情况,方法不同。比如比较大小,顺序输出,排序等问题时都要用到。所以小编决定将这些“大脑阔”的问题理顺,不再让人感觉丈二和尚摸不着头脑。给小伙伴们送上“武功秘籍”。
const常量
首先,告诉什么是const常量:const 修饰的变量成为常量 const 对象定义的时候必须赋值,也就是说const对象必须初始化。其值在程序运行的过程中不会发生改变,编译器会将其放在一个只读的内存区域,其值不能发生改变。 定义函数时,如果在函数体中不需要修改形式参数的值,建议将形式参数的值设为常量(const),以防用户不小心修改了这个值,会出现错误消息。
举例如下:
const常量
const int a = 10;
int const a = 10;//const不管在前在后,两者等价(指针也如此)
int const b = 20;
a = 20;//error
b = 10;//error
const int* p1 = &a;//const在*之前,*为解引用取值,*p1为取值,即值不能变
const int *p2 = &b;//同上
p1 = &b;//ok
p2 = &a;//ok
*p1 = 100;//error,不能再赋值
*p2 = 200;//error同上
int* const p1 = &a;
int* const p2 = &b;
p1 = &b;//error,const在*之后,即指针为常量,指针取地址不能变。
p2 = &a;//error
*p1 = 300;//ok
p2 = 400;//ok
//const权限可以同等或者减少传递,但不能放大
int a = 10;
const int ca = 30;
int *p1 = &a;//ok
const int *p2 = &a;//ok
int *p3 = &ca;//error
const int *p4 = &ca;//ok
int *const p5 = &a;//ok
int *const p6 = &ca;//error
数组数字字母交换
再者,交换数字或者字母。正序,倒序,从大到小,从小到大等等。
举例如下: 123456->654321
"abcdfe"->"efdcba"
4562->2654
形参传值交换
void Show(int *arr,int len)//交换数字,倒叙输出
{
int i = 0;
for(i;i < len;i++)
{
printf("%d",arr[i]);
}
}
void Sawp(int *arr,int len)
{
int tmp = 0;
int i = 0;
for(i;i < len/2;i++)
{
tmp = arr[i];
arr[i] = arr[len-i-1];
arr[len-i-1] = tmp;
}
}
int main()
{
int arr[10] = {0,1,2,3,4,5,6,7,8,9};
int len = sizeof(arr)/sizeof(arr[0]);
Sawp(arr,len);
Show(arr,len);
return 0;
}
字符数组与字符串常量的差异
1.char str1[10] = “abcde”;//字符数组
2.char *str2 = “abcde”;//字符串常量
3.const char *str3 = “abcde”;//等价2
str1[0] = ‘x’;//ok
str2[0] = ‘x’;//error程序崩溃
str3[0] = ‘x’;//error编译错误
指针传值示意图
形参传值交换
void Swap(int a,int b)交换不成功
{
int tmp = 0;
tmp = a;
a = b;
b = tmp;
}
void Swap(int *a,int *b)交换不成功
{
int *tmp;/野指针
*tmp = *a;
*a = *b;
*b = *tmp;
}
void Swap(int *a,int *b)//只传递形参
{
int *tmp;
tmp = a;
a = b;
b = a;
}
void Swap(int *a,int *b)
{
int tmp;
tmp = *a;
*a = *b;
*b = tmp;
}
int main()
{
int a = 5;
int b = 9;
int *p1 = &a;
int *p2 = &b;
if(a < b)
{
Swap(p1,p2);
}
printf("max = %d,min = %d\n",a,b);
return 0;
}
运行结果
字符串交换
最后,字符串交换,和数字不同,要调用字符串交换函数判断。
看实例:
#include<stdio.h>
#include<string.h>
void StrSort(char **str,int len)
{
char * tmp;
for(int i=0;i<len-1;i++)
{
for(int j=0;j+1<len-i;j++)
{
//if(str[j] > str[j+1])
if(strcmp(str[j],str[j+1]) > 0)
{
tmp = str[j];
str[j] = str[j+1];
str[j+1] = tmp;
//printf("%s\n",str[j]);
}
}
}
}
void Show(char **str,int len)
{
for(int i=0;i<len;i++)
{
printf("%s\n",str[i]);
}
}
int main()
{
char *str[5] = {"Hello","Nice",
"to","meet","you",
};//指针数组
StrSort(str,sizeof(str)/sizeof(str[0]));
Show(str,sizeof(str)/sizeof(str[0]));
return 0;
}
运行结果