分享免费的编程资源和教程

网站首页 > 技术教程 正文

C|指针分类与void指针的赋值、解引用与算术运算

goqiw 2024-10-04 22:07:47 技术教程 18 ℃ 0 评论

我们现在使用的绝大多数计算机都是冯诺依曼机,其核心就是“存储程序控制”,数据和代码都需要先加载到可寻址的内存。在C语言中,数据和代码分别通过变量名和函数名来寻址。我们知道,指针是一个特殊的地址,特殊在于其需要有类型信息,由此,指针变量可以区分为数据指针变量和函数指针变量。还有一种特殊的指针变量,称为void*指针变量,其类型可以待定,在显式地转换为其它特定类型之前,只是一个单纯的内存地址,所以void*指针变量也称为泛型指针变量,。

#include <stdio.h>
#include <malloc.h>

void * memset(void *dst, int val, size_t count)
{
	//assert(dst);          // 这里需要检验dst的有效性
	char* ret = (char*)dst; // 内存按字节编址,char与1个字节长度一致
	while (count--)                
	{
		*ret++ = (char)val;
	}
	return dst;
}
int* add(int* a,int* b)
{
    *a += *b;
    return a;
}
void* voidPointer(void *vp,int n)
{
    int a = 33;
    int ar[5];
    memset(ar,0,sizeof(ar));
    int arr[] = {1,2,3,4,5};
    vp = &a;       // void指针做左值,右值不需要做类型转换
    printf("%d\n",vp==&a); // 1
    int *q = (int*)vp;   // void指针做右值,需要做类型转换
    printf("%d %d\n",*(int*)vp,*q);    // 33 33
    
    vp = arr;
    printf("%d %d\n",*(arr+2),*((int*)vp+2)); // 3 3

    int*(*fp)(int*,int*) = add;
    printf("%d\n",*fp(&a,arr+2)); // 7
    vp = (int*(*)(int*,int*))*(void**)&add;
    //printf("%d\n",*vp(&a,arr+2)); 
    void* (*vfp)(void*,void*) = (void* (*)(void*,void*))add;//36
    printf("%d\n",*((int*(*)(int*,int*))vfp)(&a,arr+2)); //39

    int *var = (int*)malloc(sizeof(int)*n);
    return var;
}

int main()
{
    void *vp = NULL;
    vp = voidPointer(vp,5);
    int *p = (int*)(vp);
    *p = 1;
    getchar();
    return 0;
}

-End-

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表