#include<stdio.h>
//return 只能返回一个数!!!!!
//函数不可以嵌套调用!!!!! 但是可以嵌套定义
//函数必须保证 先 声明 后 使用
//函数的设计应该尽量 高内聚 低耦合!!!!!!
//函数应该尽量 少 的去使用全局变量!!!!!
//函数当中形参是在栈当中保存的!!!!!
//逗号表达式-(a,b,c,d,e,f。。n)整个表达式结果是()里最后一个表达式的结果 n
//sizeof函数求的是数组的字节大小 -cahr 当中\0也是一个大小!!!!!
//stelen char当中不算\0所占字符串大小!!!!!
//随着数组下标由小到大变化 -地址由低到高变化 (数组里面相邻元素的地址是连续的)
//表达式求值先看是否存在整形提升与算术装换 后进行计算!!!!!
//在32位下 :int类型:占 4 个字节;指针占 4 个字节;操作系统可以使用的最大内存空间 2^32!!!!!!!!!!
//在64位下 :int类型:占 4 个字节;指针占 8 个字节;操作系统可以使用的最大内存空间 2^64
//定义全局变量一般不初始化默认是0 !!!!!(定义在main()之前的变量)
//递归是不能无限递归下去的
//定义一个函数Init()使得函数初始化全为0
//定义函数daying()使得函数打印数组当中的元素
//定义函数nizi()实行数组元素的逆置(数组元素倒放) 再打印数组元素
//void Init(int arr[], int sz)//因为不用返回值 所以定义为void
//{
// int i = 0;
// for (i = 0; i < sz; i++)
// {
// arr[i] = 0;
// }
//
//}
//void daying(int arr[],int sz)
//{
// int i = 0;
// for (i = 0; i < sz; i++)
// {
// printf("%d ", arr[i]);
// }
//}
//void nizi(int arr[], int sz)//其实逆置可以把元素两两交换
//{
// int left = 0;
// int right = sz-1;
// int i ;
// while (left < right)
// {
// i = arr[left];
// arr[left] = arr[right];
// arr[right] = i;
// left++;//记得要left与right移动!!!!!
// right--;
// }
// printf("\n");//使得两组数据不同行
//}
//int main()
//{
// int arr[11] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,11 };
// int sz = sizeof(arr) / sizeof(arr[0]);
// //Init(arr, sz);//初始化
// daying(arr, sz);//打印数组元素
// nizi(arr, sz);//逆置数组
// daying(arr, sz);//打印逆置数组元素
// return 0;
//}
//交换数组a与b(数组a b一样大)的元素
//void jh(int a[], int b[],int sz)
//{
// int i= 0;
// for (i = 0; i < sz; i++)
// {
// int temp= a[i];
// a[i] = b[i];
// b[i] = temp;
// }
//}
//void daying(int arr[],int sz)
//{
// int i = 0;
// for (i = 0; i < sz; i++)
// {
// printf("%d ", arr[i]);
// }
// printf("\n");
//}
//int main()
//{
// int a[] = { 1, 3, 5, 7, 9 };
// int b[] = { 2, 4, 6, 8, 10 };
// int sz = sizeof(a) / sizeof(a[0]);
// jh(a, b,sz);
// daying(a, sz);//打印数组当中的元素
// daying(b, sz);
// return 0;
//}
//int a[]={1,1,1,1,1}
//short* p=(short*)a --把 int a 强制类型转换成 short a 类型 !!!!!(short一个占2个字节)
//int a =0x11223344 --在内存当中是到着存放的 44 33 22 11 -4个字节
//cahr* p=(cahr*)&a;*p=0; --因为char是一个字节 所以只改变了 44 这个字节使得其变成了 00;!!!!! 所以输出 11223300;
//int i;//定义全局变量 -不初始化默认为 0
//int main()
//{
// i--;//-1
// if (i > sizeof(i))//sizeof()是计算变量、类型所占内存的大小 一定是>=0的!!!!!并且是无符号的 !!!!!所以 i也会转化成无符号表达的!!!!!
// {
// printf(">\n");
// }
// else{
// printf("<\n");
// }
// return 0;
//}
//统计变量当中二进制当中1的个数!!!!!
//#include<stdlib.h>
//int count_bit_one(unsigned int n)//如果n是负数的话把其换成 无符号来计算 最高位不是符号位
//{
// int count = 0;
// //可利用二进制/2 %2来判断1的个数
// while (n)//while不为0即可以运行
// {
// if (n % 2 == 1)
// {
// count++;
// }
// n = n / 2;
// }
// return count;
//}
//int count_bit_oneer(int n)
//{
// int count = 0;
// int i = 0;
// for (i = 0; i < 32; i++)//因为int 是4个字节 32位编译器当中是 32 位的
// {
// if (((n >> i) & 1) == 1)//不断向右移动 i位 与上1 看其是否!=1;
// {
// count++;
// }
// }
// return count;
//}
//int count_bit_onesahng(int n)//最好的方法!!!!!
//{
// int count = 0;
// while (n)
// {
// n = n&(n - 1);
// count++;
// }
// return count;
//}
//int main()
//{
// int a = 0;
// scanf_s("%d", &a);
// //写一个函数求二进制表示当中有几个一 -该变量的二进制表示是 补码!!!!!
// //int count = count_bit_one(a);//法一 :循环法
// //int count = count_bit_oneer(a);//法二 :按位与
// int count = count_bit_onesahng(a);//法三:n&n-1
// printf("%d\n", count);
// //system("pause");//system库函数-执行系统命令-pause(暂停) 要加上头文件#include<stdlib.h> 此代码与系统当中的应用台是功能一样的!!!!!
// return 0;
//}
//统计两个int变量当中的二进制有多少位是不同的
//int get_diff_bit(int m, int n)
//{
// int count = 0;
// int tmp = m^n;//异或 相同为0,不同为1
// while (tmp)//利用上面的函数 求其中二进制位有多少个1 !!!!!
// {
// tmp = tmp&(tmp - 1);
// count++;
// }
// return count;
//}
//int main()
//{
// int m = 0;
// int n = 0;
// scanf_s("%d%d", &m, &n);
// int count = get_diff_bit(m, n);
// printf("%d\n", count);
// return 0;
//}
//获取int 变量当中的二进制的 奇数位与偶数位 并且分别打印!!!!!
//void print(int m)
//{
// int i = 0;
// printf("打印的是奇数位");
// for (i = 30; i >= 0; i -= 2)
// {
// printf("%d", (m >> i) & 1);
// }
// printf("\n");
// printf("打印的是偶数位");
// for (i = 31; i >= 1; i -= 2)
// {
// printf("%d", (m >> i) & 1);
// }
//}
// int main()
// {
// int m = 0;
// scanf_s("%d", &m);
// print(m);
// return 0;
// }
//输出乘法口诀表
//void print_table(int n)
//{
// int i = 0;
// for (i = 1; i <= n; i++)//表示的是行
// {
// int j = 0;
// for (j = 1; j <= i; j++)//表示列 (<=i可以控制其打印的项数)
// {
// printf("%d * %d = %-3d ", i, j, i*j); //%-3d表示的是 输出之间相隔3个字符位
// }
// printf("\n");//打印完一行之后换行
// }
//}
//int main()
//{
// int n = 0;
// scanf_s("%d", &n);
// print_table(n);
// return 0;
//}
//逆序字符串数组
//#include<string.h>
//如果不能使用C语言原本的库函数
int my_strlen(char* str)
{
int count = 0;
while (*str != '\0')//其不等于\0就是有效字符
{
count++;
str++;
}
return count;
}
void reverse_string(char* arr)
{
int left = 0;
//int right = strlen(arr)-1;//strlen是计算字符串的长度 应该包含头文件#include<string.h>
int right = my_strlen(arr) - 1;
while (left < right)
{
int tep = arr[left];
arr[left] = arr[right];
arr[right] = tep;
left++;
right--;
}
}
int main()
{
char arr[] = "hello world";
reverse_string(arr);//传递的是arr首元素的地址
printf("%s\n", arr);
return 0;
}