加法或减法
加法偏移到之后的地址,减法偏移到之前的地址。
指针的偏移和指针的取值一样全是模块化操作,对一个指针+1意味着该指针偏移到下一个模块,所以指针的偏移完全取决于该指针的基础数据类型。
void 指针
通用指针,可以指向任意类型的指针
无法直接取值
如果要对一个void指针取值的时候必须对它强制数据类型转换来确保每一个模块多大
void * 可以接任意的类型的 *
比如:void * vpa = int * pa
void * vpa = int pa
void *vpa = char ** pa
同时,void ** 只能接void *,比如void ** vpa = &vpa(正确) voidvpa = &pa(错误)
通用函数输入下标想交换位置
#include <stdio.h>
#include <string.h>
void exchange(void* arr,int size){
int i = 0,j = 0;
printf(“请输入要交换的两个下标位置:”);
scanf("%d %d",&i,&j);
while(getchar()!=10);
char temp[size];
memcpy(temp,(char )arr+isize,size);//temp = (char*)arr +isize
memcpy((char)arr+isize,(char)arr+jsize,size);
memcpy((char)arr+j*size,temp,size);
}
int main(){
int arr[5] = {1,3,5,7,9};
char buf[6] = “hello”;
double darr[5] = {1.9,2.2,3.6,4.5,5.5};
char *str[3] ={“你好”,“中国”,“上海”};
exchange(str,8);
for(int i=0;i<3;i++){
printf("%s “,str[i]);
}
printf(”\n");
//printf(“下标地址是:%p\n”,pa);
return 0;
}
带参宏实现
#include <stdio.h>
#include <string.h>
#define EXCHANGE(arr,type) {int i = 0,j = 0;printf(“请输入要交换的两个下标位置:”);scanf("%d %d",&i,&j);while(getchar()!=10);type temp = 0;temp = ((type )arr)[i]?(type )arr)[i] = ((type)arr)[j]?(type)arr)[j] = temp;}
int main(){
int arr[5] = {1,3,5,7,9};
char buf[6] = “hello”;
double darr[5] = {1.9,2.2,3.6,4.5,5.5};
char *str[3] ={“你好”,“中国”,“上海”};
EXCHANGE(str,char *);
for(int i=0;i<3;i++){
printf("%s “,str[i]);
}
printf(”\n");
//printf(“下标地址是:%p\n”,pa);
return 0;
}