学习笔记
++问题:
比如++i,返回的是i+1的值。而i++则是先返回i的值给调用者,然后i在自加1。 具体一点的话,如i初始值为1,j=++i后,i先+1并返回结果2给j。而j=i++后,i等于1先赋给j,i再自增1
char*&问题:
//void* my_memcpy(void* dest, const void* src, size_t num)
//{
// void* ret = dest;
// while (num--)
// {
// *(char*)dest = *(char*)src;
// ++(char*)dest;
// ++(char*)src;
// }
// return ret;
//}
////struct s
////{
//// int age;
//// char name[50];
////};
//
//int main()
//{
// //struct s student[] = { {15,"王五"},{16,"李六"}};
// //struct s copy[3] = { 0 };
// char arr1[] = "abcdef";
// char arr2[20] = { 0 };
// char* arr=(char*)my_memcpy(arr2,arr1,sizeof(arr1));
// printf("%s", arr);
// return 0;
//}
const问题:
const char* pa不能改变的时指向内容 char* const pa不能改变的是指针
左定值,右定向
字节和字长问题:
一个字母就是一个字节,一个汉字两个字节=一个字,在同一时间中处理二进制数的位数叫字长,现在的cpu大部分是32位的,那么同一时间处理的字长为32位的二进制数据
枚举警告:
enum alphabet
{
A,//枚举常量
B,
C,
D
};
int main()
{
enum alphabet word1 = A;
return 0;
}
严重性 代码 说明 项目 文件 行 禁止显示状态 警告 C26812 枚举类型“alphabet”未设定范围。相比于 "enum",首选 "enum class" (Enum.3)。
野指针赋值问题
如下图,指针未初始化时为野指针,所以不能进行随便解引用赋值操作
int main()
{
int* p;
*p = 10;
}
1的存储问题
extern用法
extern是用于声明一个外部变量/函数。即当一个变量/函数需要使用,但是在别的.c/.h文件中定义时,我们需要引用extern来对这个变量/函数进行声明
extern void Function(int a, intb)
extern variable;
宏的问题
#define Mul(x) x*x
int main()
{
Mul(5 + 1);
return 0;
}
上面的代码输出的结果不是36,而是11,因为宏是完全替代进去,不会运算,即会变成5+1 * 1 +5=11
同理下面的结果是12
#define Add(x) x+x
int main()
{
int ret = 5 * Add(2);
return 0;
}
带有副作用的宏参数
#define MAX(x,y) ((x)>(y)?(x):(y))
int main()
{
int a = 10;
int b = 11;
int ret = MAX(a++, b++);
printf("%d %d %d", a, b, ret);//11 13 12
return 0;
}
MAX(x,y) ((a++)>(b++)?(a++):(b++))//b加了两次
int(x)问题
(int)x是强制类型转换
int(x)应该算是取整数的意思
二维数组与一维数组问题
C语言里,所有下标的表示法(如p[3]),最后都会转换成这种 * (p+3) 理解了这一点,那么,二维形式的 p [i][j] 会被转换成 * ( * (p + i) + j),即:p[3][2]会被转化成 * (* (p +3) + 2)
表达字符串的数组声明问题
数组的声明有:
char arr[] = {"a"};
char arr[] = "a";
char arr[2] = "a";
字符串子串计算方法
s=n(n+1)/2+1;n是字符串里面的字符数
创建任意大小二维数组
malloc方法:
int main()
{
int n = 0;
int m = 0;
int** p = 0;
scanf("%d,%d", &n, & m);
p = (int**)malloc(sizeof(int*)*n);//行
for (int i = 0; i < n; i++)
{
p[i] = (int*)malloc(sizeof(int*) * m);
}
if (p == NULL)
{
return 0;
}
return 0;
}
new创建一维数组的方法:
int* a = 0;
int x, y;
scanf("%d,%d", &x, &y);
a = new int[x * y];
for(int i = 0; i < x; i++)
{
for(int j = 0; j < y; j++)
{
*(a + i * y + j) =i;
printf("%d ",*(a + i * y + j));
}
printf("\n");
}
new创建二维数组的方法:
#pragma warning(disable:4996)
#include<stdio.h>
#include<malloc.h>
#include<string.h>
int main()
{
int** a = 0;
int n = 0;
int m = 0;
int i = 0;
int j = 0;
scanf("%d,%d", &n,&m);
a = new int* [n];
for (int i = 0; i < n; i++)
{
a[i] = new int[m];
}
for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
{
a[i][j] = i + j;
printf("%d ", a[i][j]);
}
printf("\n");
}
for (i = 0; i < n; ++i)
delete[] a[i];
delete[]a;
return 0;
}
关于printf函数里的“#”问题
printf("%#o",1234);--#可以控制输出八进制数的前导0,同理也可用%#x输出十六进制数字前导0x,要想输出0X则用%#X
scanf函数里的%d %c %s问题
首先,scanf是从缓冲区stdin中读取信息并且清除,
%d和%s作用相似,空白字符都可以起到分离两个变量("%d %d")的作用,而%c不同,任何空白字符不能有分离%c变量的作用,包括空白字符也会被读取。
scanf清除缓存
1.getchar();
2.fflush(stdin);
3.scanf(" %c",&a);百分号前加空格,这与%c的工作原理有关,不加空格,%c会读取输入缓冲区的第一个字符,加了后,它会读取空格后的第一个字符。所以对于scanf()而言,%c是个较为特殊的说明符。 %c前没空格,scanf()将读取标准输入流中的第一个字符,%c前有空格,scanf()则读取标准输入流中第一个非空白字符,舍弃了空白字符
辗转相除法
#include<stdio.h>
int main()
{
long long int a = 0, b = 0, tmp = 0, num = 0, mul = 0;
scanf("%lld %lld", &a, &b);
if (a > b)//确保a<b
{
tmp = a;
a = b;
b = tmp;
}
tmp = a*b;
//最大公约数num
while (a && b)
{
if (a > b)
a = a % b;
else
b = b % a;
}
num = a > b ? a : b;
//最小公倍数
mul = tmp /num;
printf("%lld", mul + num);
return 0;
}
pow sqrt
pow函数用于求平方、sqrt函数用于求开方
while(~scanf("%d", &a))
scanf没有输入时返回-1,按位取反就是0,等价于scanf("%d",&a)!=EOF
只读取部分数字/字符的情况
int main()
{
int a = 0,b=0;
char c[3] = { 0 };
scanf("%2s%4d%2d",c, &a, &b);//只读取2个字符,4个数字,2个数字
printf("%s %d %d",c, a, b);
}
输入/输出函数中%后的数字问题
scanf("%d %3f", &weight, &high);--只录三位,只录小数位后2位不能写成%.2f,应该写成前面形式%.nf,也可改写成a-(int)a。这种表示只读取小数位,后面在限定输出位数即可
scanf类型问题
scanf括号里面的类型不能改变/错,如不能写成scanf("%d",&a);如果char a =0;
ceil和floor
ceil有向上取整的意思,floor有向下取整的意思
float a = 1.6, b = 1.2, c = 0, d = 0;
c = ceil(1.6);//2.0
d = floor(1.6);//1.0
printf("%.1f %.1f",c,d);
质数问题(不懂原理)
判断质数时,利用试除法时每次可增加2个单位,并且做多可以到n/i
{
//或者i<sqrt(n)
for(int i=2;i<=n/i;i++)
if(n%i==0)
return false;
return true;
}
fmod函数
这个库函数用于取余数,即 double fmod(double x, double y),返回x/y的值
abs函数、fabs函数
abs返回整型参数的绝对值 fabs返回浮点型参数的绝对值
#include<math.h>
int main()
{
int a = -55;
int b = 0;
b=abs(a);
printf("%d\n", b);
return 0;
}
循环中反复正负问题
int main()
{
int a = 15;
for (int i = 0; i < 16; i++)
{
a = -a;
printf("%d\n", a);
}
return 0;
}
//-15
//15
//-15
//15
//....
数组存放字符串问题
如需要存放字符串"1234",则需要开辟一个大小为arr[5]的数组,因为需要存放'\0'
回文数一种巧妙的写法(转载)
#include<stdio.h>
int main()
{
int n;
scanf("%d", &n);
int i = 0;
for(i = 1; i <= n; i++)
{
int t = 0, num = i;
while(num > 0)
{
t = t*10 + num % 10;
num = num / 10;
}
if(t == i)
printf("%d\n", i);
}
return 0;
}
scanf输入和printf输出问题
在scanf未输入完之前,printf不会输出
字符串大小写输出
strlwr(arr)小写 strupr(arr)大写
Python重写new问题
instance = None
def __new__(cls, *args, **kwargs):
if cls.instance is None:
cls.instance = super().__new__(cls)
return cls.instance
else:
return cls.instance