《每天一分钟学习C语言·十二》各种指针问题

发布时间:2024年01月16日

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]; 那每个元素都是野指针,只要给数组赋了一个值,其他没有赋值的元素都会默认初始化。

在这里插入图片描述
文章来源:https://blog.csdn.net/cs1395293598/article/details/135632993
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。