转自
https://blog.csdn.net/qq_37867156/article/details/81837545 关于 0x3f3f3f3f
https://www.cnblogs.com/qunqun/p/8653806.html int long long unsigned long long 数据范围
https://blog.csdn.net/qq_34637408/article/details/70877953 二维数组做函数参数 及返回值
https://www.cnblogs.com/shuqingstudy/p/4733307.html c 语言 memcpy 二维数组的复制
百度百科:左值和右值
时时勤拂拭
一,int long long unsigned long long
unsigned int 0~4294967295
int 2147483648~2147483647 10位 2^31-1
unsigned long 0~4294967295
long 2147483648~2147483647
long long的最大值:9223372036854775807 19位 2^63-1
long long的最小值:-9223372036854775808
unsigned long long的最大值:18446744073709551615 20位 2^64-1
__int64的最大值:9223372036854775807
__int64的最小值:-9223372036854775808
unsigned __int64的最大值:18446744073709551615
二,pi 的定义
const double pi = acos(-1.0);
const double pi = 4.0*atan(1.0);
const double pi = 2*asin(1.0); //注意定义域
三,无穷大的定义
u 作为数字后缀 代表 unsigned 类型变量
>> 1右移一位
在32位的情况下,连起来就是 将32位的0取反后 右移一位。
也就是 int 的最大值 2147482347
*p = 4;
free(p);
p = NULL;
2. 所有负整数的按位取反是其本身+1的绝对值
3. 零的按位取反是 -1(0在数学界既不是正数也不是负数)
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h> typedef int(*R)[3]; // 列数固定 void fun1(int a[][3]) { a[1][3] = 666; } R fun2(int a[][3]) { a[1][3] = 555; return a; } int main(void) { int b[3][3] = { 0 }; fun1(b); printf("%d ", b[1][3]); memcpy(b, fun2(b), sizeof(fun2(b))); printf("%d ", b[1][3]); system("pause"); return 0; }
那么问题来了,为什么调用第一个函数之后 main 函数的 数组 b 会变?
其实很简单,其实数组传递的是指针,在函数调用中,它并没有在栈中另开一个数组
而是通过指针引用 mian 函数中的数组。之前完全没有想到。( ´◔ ‸◔`)
七,数组的复制与比较
① memcmp: 三个参数
-
如果返回值 < 0,则表示 str1 小于 str2。
-
如果返回值 > 0,则表示 str2 小于 str1。
-
如果返回值 = 0,则表示 str1 等于 str2。
② memcpy void
参数: (destin,source,n)
-
destin-- 指向用于存储复制内容的目标数组,类型强制转换为 void* 指针。
-
source-- 指向要复制的数据源,类型强制转换为 void* 指针。
-
n-- 要被复制的字节数。
int main(void) { char p[] = { 'a','b','c' }; printf("%d ", strlen(p)); printf("%c ", *(p + 3)); system("pause"); return 0; }
首先,这段代码是可以正常运行的,其中我得到的 strlen(P) 为 15,这里根据大家环境不同,应该有区别
但明明 p 数组长度为 3,怎么没有报错。大家看一下错误的代码:
int main(void) { char p[] = { 'a','b','c' }; //printf("%d ", strlen(p)); printf("%c ", *(p + 3)); system("pause"); return 0; }
没有 strlen 就直接报错 了
我估计是 因为这里没有限制长度,然后 strlen 里面的 循环就扩展了 数组的长度,
但是,下面这个代码却没有问题:
int main(void) { char p[] = { 'a','b','c' }; printf("%d ", *(p + strlen(p) + 10)); system("pause"); return 0; }
搞不明白 ( ‘-ωก̀ )
九,缩写
#define mem(a,b) memset(a,b,sizeof(a))
十,左值与右值
#define _CRT_SECURE_NO_WARNINGS #include<stdlib.h> #include<stdio.h> int main(void) { #define MAX(x,y) (x>y)?(x):(y) #define MIN(x,y) (x<y)?(x):(y) printf("%d ", MIN(3, 4)); printf("%d ", MIN(11, MAX(3, 4))); system("pause"); }
这个看着没什么问题,但是一运行第二个结果就错了。为什么会这样呢?
那是因为 #define 只是替换而已 而且 三目运算符 是右结合,即从右向左算的,你连用两个#define,自己一展开就会发现 运算顺序乱了。
解决方法,只要在前面最外面加一个括号就可以了,保证不会和外界的混淆,代码如下:
#define _CRT_SECURE_NO_WARNINGS #include<stdlib.h> #include<stdio.h> int main(void) { #define MAX(x,y) (x>y?x:y) #define MIN(x,y) (x<y?x:y) printf("%d ", MIN(3, 4)); printf("%d ", MIN(11, MAX(3, 4))); system("pause"); }
========== ========= ======== ======= ====== ===== ==== === == =
Do you think, because I am poor, obscure, plain, and little,I am soulless and heartless?
You think wrong!
I have as much soul as you, and full as much heart!
And if God had gifted me with some beauty and much wealth, I should have made it as hard for you to leave me, as it is now for me to leave you.
I am not talking to you now through the medium of custom, conventionalities, nor even of mortal flesh; it is my spirit that addresses your spirit,
just as if both had passed through the grave, and we stood at God's feet, equal, -- as we are! —— —— Jane Eyre