苦学数组与指针@新手露露

知识点总结

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值