C语言/C++基础知识代码整理

强制类型转换

#include<iostream>
using namespace std;
int main()
{
	double a = 12.3;
	int *p = (int*)&a;
	*p = 12;
	*(p + 1) = 23;
	cout << *(int*)&a <<endl<< *((int*)&a + 1)<<endl;
	//直接打印double型的a会报错,8字节的空间,前一半12后一半23
	
	*(int*)((short*)p + 1) = 88;
	cout << *(int*)((char*)&a + 2)<<endl;
	//读取中间4字节的内容,从第3个字节开始,用1字节的char+2


	//指针/地址的类型决定指针/地址的读写方式(字节数)+1 +-8
	system("pause");
	return 0;
}

数组逆置

#include<iostream>
using namespace std;
int a[10] = { 8,5,4,6,1,2,3,7,45,96 };
void sznz(int a[], int n)
{
	
	for (int i = 0; i <5; i++,n--)
	{
		int temp;
		temp = a[i];
		a[i] = a[n-1];
		a[n-1] = temp;

	}
}
int main()
{
	
	/*for(int i=0;i<10;i++)
	{
		cin >> a[i];

	}*/
	
	sznz(a, 10);
	for (int j = 0; j < 10; j++)
	{
		cout << a[j] << endl;

	}

	system("pause");
	return 0;

}

指针逆置

#include <iostream>
using namespace std;
void reverse(int *a, int n)
{
	int *p = a, *q = a + n - 1;  // 分别指向第一个和最后一个元素
	for (; p < q; ++p, --q)
	{
		int tmp = *p;
			*p  =  *q;
		*q = tmp;
	}
}

int main()
{
	int a[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
	reverse(a, 10);    // 传递数组名
	for (int i = 0; i < 10; ++i)
		cout << a[i] << '\t';
	cout << endl;
	system("pause");
	return 0;
}

数组指针

#include<iostream>
using namespace std;
//指针是基本数据变量类型,地址是数值,指针用来装地址
int main()
{
	int a[5] = { 12,25,32,4,1 };
	int *p = &a[0];//int型指针装数组中第1个元素12的地址
	int(*p1)[5] = &a;//数组指针,装数组a的地址,5是数组a的大小,

	//int(*p1)[6] = &a   【6】不可以!必须相等!!否则报错!!!


	//*p == a[0] == 12;
	//p==*p1 == a == &a[0];//p是这个数组 首元素的地址(首地址)   p+1指向第一个数组第二个元素
	//p1==&a;                p1是这整个数组的地址               p1+1指向第二个数组 
	//**p1==*p==a[0]=12;

	cout << p << endl << *p1 << endl << &a << endl;
	//第一个数组地址即这个数组首元素地址

	//cout << ++p1 endl;偏移后p1变化会影响后面输出

	cout << &a + 1 << endl << *p1 + 1 << endl; //偏移后不会影响后面输出

	cout << (*p1)[2]<<endl;
	//a是第一个数组,p1[2]是第三个数组  
	//*p1[2]是第三个数组的首元素
	cout << *(*p1 + 2) << endl;

	cout << p[2] << endl;
	cout << 2[p] << endl;
	cout << *(p + 2) << endl;
	cout << a[2] << endl;


	//p1是(数组)指针的名字
	//注意小括号使用,因为[]优先级高于*
	system("pause");
}

指针数组

//数组元素为指针的数组称之为指针数组。指针数组可以让每个数组元素指向不同的内存块,实现对不同大小的内存块的数据统一管理。
//程序:从键盘输入一组字符串使用指针数组对他们进行由小到大的排序并输出
#include<iostream>
using namespace std;
int main()
{
	int b = 3,
		c = 5,
		d = 1,
		e = 7,
		f = 2;

	int *a[5] = { &b,&c,&d,&e,&f};//指针数组a装5个元素的地址
	cout << d << endl;
	*a[2] = 9;//== d=9;改变d的值
	cout << d << endl;

	//指针数组拉链结构,不同于2维数组!!指针数组内的不同数组之间各元素不是连续的
	int q[2] = { 3,2 },
		w[3] = { 5,2,6 },
		h[2] = { 9,4 },
		r[5] = { 7,5,4,3,1 };
	*(r) = 9;
	int *t[4] = { &q[0],w,h,r };//t是(指针)数组的名字,4是该数组的大小
	//也可以用 int * (t[6])={ &q[0],w,h,r };即定义大一点的数组来装地址,没用到的空间不影响 
	cout << *(t[1]+0) << endl;//输出w[0]即5
	cout << t[1][0] << endl;
	
	char ch[5][20];
	char *pch[5];
	int i, j;
	for (i = 0; i <5; i++)
	{
		cin.getline(ch[i], 20);//键盘输入字符串,给字符数组赋值
		pch[i] = ch[i];//将个字符串的首地址传给指针数组各元素
		cout << &pch[i];
	}
	//排序
	
	system("pause");
	return 0;
}

有参数有返回值的函数

#include<iostream>
using namespace std;
int FindMaxnum(int *p, int length,int * p1)
{
	//int i = 0;
	int maxnum = p[0];
	for (int i = 0; i < length; i++)
	{
		if (p[i] >= maxnum)
		{
			maxnum = p[i];
		}
	}
	*p1 = maxnum;
	return maxnum;
}
int main()
{
	int a[6] = { 45,55,87,4,5,22 };
	int n = 0;//不初始化可能出问题
	cout << "最大值为" << FindMaxnum(a, 6,&n ) << endl;
	cout << "最大值:" <<n << endl;
	system("pause");
}

计算奇数和

/* 设计一个程序,从键盘输入10个整数,并计算其中奇数的和。
提示:利用一维数组来存放10个整数。判断整数n是否为奇数:n % 2 != 0。
#include<iostream>
using namespace std;
int main()
{
	int num[10], sum=0;
	for (int i = 0; i < 10; i++)
	{
		cin >> num[i];
		if (num[i] % 2 != 0)
		{
			sum += num[i];
		}
	}
	cout << sum;
	system("pause");
	return 0;
}*/

寻找最大偶数

/*3. 设计一个程序,寻找10个正整数中的最大偶数,若该组数据中不存在偶数,则输出“未发现偶数”*/

#include<iostream>
using namespace std;
int main()
{
	int num[10];
	int max=0;
	int i = 0;
	for (int i = 0; i < 10; i++)
	{
		cin >> num[i];
	}
	max = num[0]; 
	for (int i = 0; i < 10; i++)
	{
		if (num[i] % 2 == 0 && num[i] > num[0])
		{
			max = num[i];


		}
	}
		cout << "最大偶数为" << max << "\n";
		 if(num[i] % 2 != 0)
		{
			cout << "未发现偶数" << "\0";
		}

	
	system("pause");
	return 0;
}

求平均最大值/最小值

#include <iostream>
using namespace std;
int main()
{
	int i, Ave, Min, Max;
	int data[8] = { 0,112,43,78,-11,-6,7,9 };
	Ave = 0;
	for (i = 0; i < 8; i++)
		//********error********
		Ave += data[i];
	Ave /= 8;
	cout << "平均值为: " << Ave << endl;
	Max = Min = data[0];
	for (i = 0; i < 8; i++)
	{
		//********error********
		if (data[i] > Max) Max = data[i];
		//********error********
		if (data[i] < Min) Min = data[i];
	}
	cout << "最大值为: " << Max << endl;
	cout << "最小值为: " << Min << endl;
	system("pause");
	return 0;
}

命令行参数

#include<iostream>
using namespace std;

//工程属性/调试/命令行参数
int main(int argc, char*argv[])//字符数组本质是指针 所以char* *argv也可以
{
	cout << argc << endl;
	/*cout << argv[0] << endl;//得到自己的路径
	cout << argv[1] << endl;
	cout << argv[2] << endl;*/
	for (int i = 0; i < argc; i++)
	{
		cout << argv[i] << endl;
	}
	system("pause");
	return 0;

}

malloc函数

#include<iostream>
//malloc头文件为<stdlib.h>和<malloc.h>
//因为是内建函数所以不加也可以
using namespace std;
int main()
{
	int *p=(int*)malloc(4);//申请4字节的空间大小(int,long型,float,2个short 都是4字节),并强转为int型
	//double *d;
	//d=(double*)malloc(8u);//加u后缀表示无符号的8,写不写意义不大,编译器会帮你转换
	//d=(double*)malloc(sizeof(double));也可以使用sizeof得出空间大小
	//size_t  == unsigned int;注意32位的编译器环境下4字节,64位的编译器为8字节
	int c = sizeof(size_t);
	cout <<"size_t大小为"<< c << endl;

	int *p1 = (int*)malloc(sizeof(int)*10);//申请10个整形元素的40字节空间
	for (int i = 0; i < 10; i++)
	{
		p1[i] = i + 1;
		cout << p1[i] << endl;//*(p1+i)
	}

	memset(p1, 0, 40);
	cout << "memset赋值后" << endl;
	for (int i = 0; i < 10; i++)
	{
		cout << *(p1 + i) << endl;
	}
	

	//p1++;必须释放首地址否则崩溃
	free(p1);//释放空间归还给操作系统,只可free一次

	p1 = NULL;


	//malloc动态一维数组
	
	unsigned int q;
	int *w;
	cout << "输入动态数组大小" << endl;
	scanf_s("%u", &q);
	w = (int*)malloc(q);
	free(w);
	w = NULL;

	//二维数组指针
	int(*g)[2][3] = (int(*)[2][3])malloc(sizeof(int) * 2 * 3);
	
	int z[2][3];
	int(*z1)[2][3] = &z;
	//*g == z;
	//*z1 == z;

	(*g)[0][0] = 1;//z[0][0]
	*( *( (*g)+0)+1) = 2;//z[0][1]
	*((*g)[0] + 2) = 3;//z[0][2]
	(*g)[1][0] = 4; //z[1][0]
	*(*((*g) + 1) + 1) = 5; //z[1][1]
	(*g)[1][2] = 8;//z[1][2]


	//!!!总结:
	//*(p+i)==p[i]
	//*((*g)+i)==g[i]
	// *( *((*g)+i)  +j)==g[i][j]
	//(*g)的小括号一定要加上!!!

	cout << "打印二维数组6个元素" << endl;
	for (int i = 0; i < 2; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			cout << (*g)[i][j] << endl;
		}


	}
	free(g);
	g = NULL;
	system("pause");
	return 0;

}

calloc和realloc函数

#include<iostream>
using namespace std;
int main()
{
	int *p = (int*)calloc(5, 4);//申请一段空间数组,5个元素,每个元素4字节
	//calloc申请数组空间内元素的值,默认初始化所有元素为0

	for (int i = 0; i < 5; i++)
	{

		cout << p[i] << endl;
	}

	size_t a = _msize(p);//调用_msize函数返回(无符号整形)空间大小,参数为空间首地址

	cout << "申请空间大小为" << a << endl;


	int *p1 = (int*)realloc(p, 30);//realloc(原空间的首地址,重新分配空间字节大小)
	//p1==p用p1去接首地址p两者本质一样

	//如果重新申请的空间太大系统无法分配,系统会选择其他更大的内存空间或者返回NULL

	 a = _msize(p1);
	cout << "重新申请空间大小为" << a << endl;
	

	free(p);
	free(p1);
	system("pause");
	return 0;
}
发布了20 篇原创文章 · 获赞 26 · 访问量 3563

猜你喜欢

转载自blog.csdn.net/qq_42837890/article/details/104328677