确定当前机器的字节序
//大端字节序:数据的低位保存在内存的高地址处,高位保存在内存的低地址处。
//小端字节序:数据的低位保存在内存的低地址处,高位保存在内存的高地址处。
//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],就是数组的类型
}
}