1.int,short,long都是signed的 但是char可能是signed 也可能是unsigned的——《C++ Primer》
2.在16位的PC中 char类型占1个字节 int占2个字节 long int占4个字节 float占四个字节 double占八个字节
3.自增运算符和自减运算符即使是在判断条件中使用也会实际生效
int i = 1;
int j = i++;
if((i > j++) && (i++ == j)) i += j;
第一行:i=1
第二行:因为是后自增 因此先把1赋值给j 后i+1 所以此时i=2 j=1
第三行:i>j++翻译为2>1 这个正确 但是j++需要自增 所以变成了i=2j=2
第二个条件:i++ 所以i是原值参与运算 i=2 j=2相等 但是这个考虑完后i++ 所以此时i=3
因为或运算的两边都成立 真真为真 则if语句成立 因此i = i+j =5
前自增和后自增的差异要谨记
4.数组中指针的表示形式
int a[3][3] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };//一种表达形式
int a[3][3] = {{1,2,3},
{4,5,6},
{7,8,9}};
&a[2][1]取第三行第二列的元素的地址
*(a[2]+1)访问第三行第二列元素的地址
a[2]+1:运算的结果是”第三行第二列的值的地址->实际上是一个二维数组的地址
*(a+2)+1指的是第三行第二列的那个地址
备注一点: 在指针当中 *a 就是访问a这个指针变量指向地址的值 注意是值
? ? ? ? ? ? ? ? ? ? 在数组中,*(a)是访问a这个指针变量指向的地址 而不是值
? ? ? ? ? ? ? ? ? ?这个地址就是这一行的地址
a: a:第一行的地址
a: 0x7ffeefbff580
*a: 0x7ffeefbff580
**a: 1
a是整个二维数组的首地址
*a是取二维数组的第一个数组的地址 在值上和a相等 在值和意义上和a[0]相等
5.短路:
短路只会出现在逻辑运算符中 ||与&&
int j=0;
int k=1;
if(j++&&k++){};//问执行后的j与k是多少
//答案是 j=1 k=0
//因为后自增 j先带入值进去为0 但是或需要两个为真 所以后边的k被短路了 自然不会增加
int j=0;
int k=1;
if(k++||j++){};//问执行后的j与k是多少
//答案是 k=2 j=0
//因为后自增 k带入后k自增为2 因为逻辑或运算中出现了真值 所以后面的j被短路 j为0不变
6.琐碎的空指针问题
int *p=NULL;与 int *p=0与p='\0'是等价的
7.当数组在形参时的内存问题:
void print_array(int arr[]) {
int n = sizeof(arr) / sizeof(arr[0]);
for (int i = 0; i < n; i++)
printf("%d ", arr[i]);
}
int main() {
int arr[] = {1, 2, 3, 4, 5};
print_array(arr);
return 0;
}
只会输出1和2 打印两次
因为数组放在形参的时候相当于一个指针 sizeof大小为8 一个int数大小为4
所以循环只会执行两次
8.~的取反操作
#include <stdio.h>
int main() {
unsigned char a = 235;
unsigned char b = ~a;
unsigned char c = b >> 1;
printf(“%d”, c);
};
a的二进制是(1110 1011)2
对a进行取反->(0001 0100)2为b的值
b右移一位(0000 1010)2
化为十进制就是10 则答案是10
我们要记住~是对其二进制位取反的意思