1、
int arr;
int * restrict pt = &arr;
*pt = 100;
*arr = 10;
注:restrict只能修饰指针,被restrict修饰的指针指向一块内存后这块内存就归这个指针管理了,其他任何指针都不能修改这块内存的内容,这是一个约定,当然实际上也可以被其他指针修改,但通常都会遵守这个约定。这里pt控制了这块内存,按道理不管arr为多少,最终值都是100,这是一个约定,但实际arr也能修改值,最终是10
2、
time函数
time_t time(time_t *timer)
time_t为long int型,参数为NULL返回从1970-01-01 00:00:00到现在的秒数
3、
返回值和参数为void *的各自作用
#include <stdio.h>
#include <string.h>
void * f(void * i)
{
int * a = (int *)i;
*a = 10;
return (void *)a;
}
int main()
{
int i = 3;
int *arr = &i;
void * b = f(arr);
printf("%d\n", *(int *)b);
return 0;
}
函数的参数为void *表示传入的参数可以为任意类型的地址,这里传入int *类型的arr,这时需要在函数内部做个强转把void *转为int *,return的时候可以return任何类型地址,如return (int *)a,在主函数接受这个返回地址时一定要用void *类型接收,不能用任意类型地址接收,不然会报错,然后可以把void *类型返回值强转其他类型打印
4、
#define MAX extern 宏定义MAX为extern,此时MAX就是extern
MAX int i; //相当于extern int i;
5、
#define PT 0x1001H
typedef struct {
int i;
double j;
}st;
#define P ((st *)PT)
PT强转为一个结构体指针,该指针的地址为0x1001H,此时P表示PT,P->i等价于PT->i,因为PT为结构体指针,所以PT的地址为结构元素的第一个元素的地址
6、
定义一个枚举
typedef enum {
M, T, W, S, F
}day;
day d = W;
Printf(“%d\n”, d); //2
//也可以直接输出枚举的值,不需要赋值
Printf(“%d\n”, F); //4
7、
函数与函数局部变量不能共用,比如在main函数里有个布局变量int i=3,mian函数内部还有个函数f(),那么在f()函数内部就不能使用main的局部变量i,若要使用可以在函数外部定义全局变量
8、
头文件stdlib.h
system(“pause”); //暂停程序
9、
long类型在windows占4个字节,linux 32位4字节,linux 64位8字节
10、
char *arr[10] = {“huang”, “hhh”}; //指针数组,每个元素是一个字符串,前两个元素都有字符串常量区赋了地址, 后八个元素默认是给指针初始化,地址赋值给NULL,空指针不可读,故printf(“%s\n”, arr[2]); 会中断报错,如果是一个值都没有赋,char *arr[10]; 那每个元素都是野指针,只要给数组赋了一个值,其他没有赋值的元素都会默认初始化。