知识点总结
1.今日总结:int *p=&a 定义一个指针变量 *p访问间接 解应用
//16进制 内存 机器语言
//汇编语言 //高级语言
//大小端 小端:低地址存放小数据 (手机) 大端:低地址存放高数据(pc) 判断当前机器是大端还是小端
//不同类型的指针,解应用所访问的内存字节大小不一样
//void不能解应用 没有具体的大小 但是可以接受任何类型 void *泛型
//指针在32位大小为4个字节 64位平台下指针大小为8个字节 任何类型的指针大小都是4个字节 0 ‘0’ NULL
//指针加减整数 加整数 加几个字节? 取决于指针的类型。什么类型的指针就加几个字节
//void Show(int *p.int len) int len =sizeof(arr)/sizeof(arr[0]);
//区分
// int arr[] 指针数组
2:数组与指针:
*** 初始化:数组:
(1)char a[]={“Hello”};//按字符串初始化,大小为6.
(2)char b[]={‘H’,‘e’,‘l’,‘l’};//按字符初始化(错误,输出时将会乱码,没有结束符)
(3)char c[]={‘H’,‘e’,‘l’,‘l’,‘o’,’\0’};//按字符初始化
指针:
//(1)指向对象的指针:(()里面的值是初始化值)
int *p=new int(0) ; delete p;
//(2)指向数组的指针:(n表示数组的大小,值不必再编译时确定,可以在运行时确定)
int *p=new int[n]; delete[] p;
//(3)指向类的指针:(若构造函数有参数,则new Class后面有参数,否则调用默认构造函数,delete调用析构函数)
Class *p=new Class; delete p;
//(4)指针的指针:(二级指针)
int *pp=new (int)[1];
pp[0]=new int[6];
delete[] pp[0];
指针数组:
int* arr[8];
//优先级问题:[]的优先级比高
//说明arr是一个数组,而int是数组里面的内容
//这句话的意思就是:arr是一个含有8和int*的数组
数组指针:
int (arr)[8];
//由于[]的优先级比高,因此在写数组指针的时候必须将arr用括号括起来
//arr先和结合,说明p是一个指针变量
//这句话的意思就是:指针arr指向一个大小为8个整型的数组。
3.今日练习题:
1.5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果
A选手说:B第二,我第三;
B选手说:我第二,E第四;
C选手说:我第一,D第二;
D选手说:C最后,我第三;
E选手说:我第四,A第一;
比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。
2.日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个。
嫌疑犯的一个。以下为4个嫌疑犯的供词。
A说:不是我。
B说:是C。
C说:是D。
D说:C在胡说
已知3个人说了真话,1个人说的是假话。
现在请根据这些信息,写一个程序来确定到底谁是凶手。
3.在屏幕上打印杨辉三角。
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
//#include<stdio.h>
//#include<windows.h>
//int main()
//{
// int a = 0, b = 0, c = 0, d = 0, e = 0;
// for (a = 1; a <= 5; a++)
// {
// for (b = 1; b <= 5; b++)
// {
// for (c = 1; c <= 5; c++)
// {
// for (d = 1; d <= 5; d++)
// {
// for (e = 1; e <= 5; e++)
// {
// if ((2 == b && 3 != a) || (2 != b && 3 == a) == 1)
// {
// if ((2 == b && 4 != e) || (2 != b && 4 == e) == 1)
// {
// if ((1 == c && 2 != d) || (1 != c && 2 == d) == 1)
// {
// if ((5 == c && 3 != d) || (5 != c && 3 == d) == 1)
// {
// if ((4 == e && 1 != a) || (4 != e && 1 == a) == 1)
// { //对五个值均不相同的判断
// if (((a != b) && (a != c) && (a != d) && (a != e))
// && ((b != c) && (b != d) && (b != e))
// && ((c != d) && (c != e))
// && ((d != e)))
// {
// printf("a= %d, b= %d,c= %d,d= %d,e= %d\n", a, b, c, d, e);
// }
//
// }
// }
// }
// }
// }
// }
// }
// }
// }
// }
// system("pause");
// return 0;
//}
在这里//#include<stdio.h>
//#include<stdlib.h>
//int main()
//{
// int murder = 0;
// for (murder = 'A'; murder <= 'D'; murder++)
// {
// if ((murder != 'A') + (murder == 'C') + (murder == 'D') + (murder != 'D') == 3)
// printf("murder=%c\n", murder);
// }
// system("pause");
// return 0;
//}插入代码片
//#include<stdio.h>
//#include<windows.h>
//#define N 10//宏定义,方便修改,想打印几行,改动N值就行
//
数组什么时候确定大小?编译
数组什么时侯分配内存?运行
数组最大分配多少内存?1M/2M
//int main()
//{
// int arr[N][N] = { 0 };
// int i, j;
// for (i = 0; i < 10; i++){
// arr[i][0] = 1;//每一行的第一个数都为1
// arr[i][i] = 1;//每一次行列相等时的位置都为1
// }
// for (i = 2; i < N; i++){//从第二行开始
// for (j = 1; j <= i; j++){//从第一列开始
// arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];//每个数都等于它的左上值加上正上值
// }
// }
// //以下这段循环然后打印出来
// for (i = 0; i < N; i++){
// for (j = 0; j <= i; j++){
// printf("%-3d ", arr[i][j]);
// }
// printf("\n");
//
// }
// system("pause");
// return 0;
//}
4练习题加:
1.编写函数:
unsigned int reverse_bit(unsigned int value);
这个函数的返回值是value的二进制位模式从左到右翻转后的值。
如:
在32位机器上25这个值包含下列各位:
00000000000000000000000000011001
翻转后:(2550136832)
10011000000000000000000000000000
程序结果返回:
2550136832
2.不使用(a+b)/2这种方式,求两个数的平均值。
3.编程实现:
一组数据中只有一个数字出现了一次。
其他所有数字都是成对出现的。
请找出这个数字。(使用位运算)
4.
有一个字符数组的内容为:“student a am i”,
请你将数组的内容改为"i am a student".
要求:
不能使用库函数。
代码:
//#include<stdio.h>
// #include<stdlib.h>
unsigned int reverse_bit(unsigned int value)
这个函数的返回值value的二进制位模式从左到右翻转后的值
//unsigned int round(unsigned n) {
// int i;
// unsigned int tmp, sum = 0;
// for (i = 0; i < 32; i++, n /= 2) {
// tmp = n % 2;
// sum = sum * 2 + tmp;
// }
// return sum;
//}
//
//int main() {
// printf("%u\n", round(25));
// system("pause");
// return 0;
//}
//#define _CRT_SECURE_NO_WARNINGS
//#include<stdio.h>
//#include<stdlib.h>
//int main()
//{
// int num1 = 0;
// int num2 = 0;
// scanf("%d%d", &num1, &num2);
// int avg = num1 - (num1 - num2) / 2;
// printf("%d", avg);
// system("pause");
// return 0;
//}
//#include<stdio.h>
//#include<stdlib.h>
//int main()
//{
// int arr[] = { 1, 5, 5, 1, 7, 6, 7, 8, 8, 9, 9 };
// int i = 0;
// int len = sizeof(arr) / sizeof(arr[0]);
//
//
// for (i = 1; i < len; i++)
// {
// arr[0] = arr[0] ^ arr[i];//^异或运算符,相异为1相同为0.
// }
// printf("the single number is:%d", arr[0]);
// system("pause");
// return 0;
//}
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
void reverve_swap(char *left, char *right)
{
assert(left != NULL); //断言不是空指针
assert(right != NULL);
while (left < right)
{
char tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
char *reverve(char *p)
{
int len = strlen(p);
char *start = p;
char *end = NULL;
char *ret = p;
reverve_swap(p, p + len - 1); //逆序整个字符串
while (*p)
{
start = p;
while ((*p != ' ') && (*p != '\0')) //找到一块单词
{
p++;
}
end = p - 1;
reverve_swap(start, end);//逆序单个单词
if (*p == ' ') //找到空格
p++;
}
return ret;
}
int main()
{
char arr[] = "student a am I";
printf("交换前:%s\n", arr);
printf("交换后:%s\n", reverve(arr));
system("pause");
return 0;
}