确定当前机器的字节序

//大端字节序:数据的低位保存在内存的高地址处,高位保存在内存的低地址处。
//小端字节序:数据的低位保存在内存的低地址处,高位保存在内存的高地址处。
//int check_sys()
//{
//	int a = 1;
//	char* p = (char*)&a;
//	if (*p == 1)
//		return 1;
//	else
//		return 0;
//}
//int check_sys()
//{
//	int a = 1;
//	char* p = (char*)&a;
//	return *p;
//}
int check_sys()
{
	int a = 1;
	return *(char*)&a;
}
#include <stdio.h>
int main()
{
	int ret = check_sys();
	if (ret == 1)
	{
		printf("小端字节序\n");
	}
	else
	{
		printf("大端字节序\n");
	}
	
	return 0;
}

字符型的存储

#include <stdio.h>
int main()
{
	char a = -1;
	signed char b =-1;
	unsigned char c = 1;
	printf("%d\n", a);
	printf("%d\n", b);
	printf("%d\n", c);

	return 0;
}
//%u - 打印十进制无符号数

浮点型的存储的例子

#include <stdio.h>
int main()
{
	int n = 9;
	float* pf = (float*)&n;
	printf("n的值为:%d\n", n);
	printf("*pf的值为:%f\n", *pf);
	
	*pf = 9.0;
	printf("n的值为:%d\n", n);
	printf("*pf的值为:%f\n", *pf);

	return 0;
}
//能够证明整形和浮点型的存储方式不一样。

指针变量

#include <stdio.h>
int main()
{
	const char* p = "abcdef";
	//*p = 'W';
	//printf("%s\n", *p);
	printf("%s\n", p);
	//是将常量字符串的首字母地址存进了指针变量p中
	return 0;
}
//Segmentation fault - 段错误 常量字符串中的是内容是无法被改变的

对于指针变量的再理解

#include <stdio.h>
int main()
{
	char arr1[] = "abcdef";
	char arr2[] = "abcdef";
	const char* p1 = "abcdef";
	const char* p2 = "abcdef";
	if (p1 == p2)
	{
		printf("hehe\n");
	}
	else
	{
		printf("haha\n");
	}//常量字符穿,p1和p2存的为同一份字符串首字符的地址,p1和p2互不影响;
	//if (arr1 == arr2)
	//{
	//	printf("hehe\n");
	//}
	//else
	//{
	//	printf("haha\n");
	//}
	return 0;
}

指针数组的一点应用

#include <stdio.h>
int main()
{
	int arr1[] = { 1,2,3,4,5 };
	int arr2[] = { 2,3,4,5,6 };
	int arr3[] = { 3,4,5,6,8 };

	int* parr[] = { arr1,arr2,arr3 };
	int i = 0;
	int j = 0;
	for (i = 0; i < 3; i++)
	{
		for (j = 0; j < 5; j++)
		{
			printf("%d ", *(parr[i] + j));
		}
		printf("\n");
	}
	return 0;
}

数组指针

#include <Stdio.h>
int main()
{
	//int* p = NULL;  //p是整形指针 - 指向整形的指针 - 存放整形的地址
	//char* pc = NULL;//pc是字符指针 - 指向字符的指针 - 存放字符的地址
					//数组指针 - 指向数组的指针 - 存放数组的地址
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	//arr - 首元素地址
	//&arr[0] - 首元素地址
	//&arr - 数组的地址
	int(*p)[10] = &arr;
	//上面的p就是数组指针, 存放数组的指针
	int* parr[] = { arr };//存放指针的数组
	return 0;
}

#include <stdio.h>
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,0 };
	int(*p)[] = &arr;
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", *(*p+i));
	}
	/*for (i = 0; i < 10; i++)
	{
		printf("%d ", (*p)[i]);
	}*/
	return 0;
}//在这里数组指针并不实用
#include <Stdio.h>
void print1(int arr[3][5], int x, int y)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < x; i++)
	{
		for (j = 0; j < y; j++)
		{
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}
}
void print2(int(*p)[5], int x, int y)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < x; i++)
	{
		for (j = 0; j < y; j++)
		{
			printf("%d ", p[i][j]);
			printf("%d ", *((p[i]) + j);
			printf("%d ", *(*(p + i) + j));
			printf("%d ", (*(p + i))[j]);
		}//由此可以看出,数组名等于首地址,多维数组的数组名就是第一行的地址
		 //首行的地址对应数组名在一维数组里面的首元素地址
		printf("\n");
		//int (*parr[10])[5] - parr是一个数组,里面有10个数组指针,每一个数组指针指向的是一个有5个元素的数组
		//去掉数组名后剩下 int(*)[5],就是数组的类型
	}
}