简单总结C语言中各种类型的指针的概念
C语言中有很多关于指针的使用,指针也是C语言的灵魂所在,而且C语言中也有很多有关指针的概念,这里学习并总结了一些知道的概念。 char const * cp; char a='a'; 如何识别呢?根据右结合优先,先是*优先,所以这个cp变量是一个指针,然后是const修饰*,所以这是一个常量指针。即指向常量的指针。 cp=&a; //正常语法 *cp=a; //错误语法,因为其指向的值是一个常量 char * const cp; char a='a'; 如何识别呢?根据右结合优先,先是const优先,所以这个cp变量是一个常量,然后是*修饰const,所以这是一个指针常量。 cp=&a; //错误语法,因为其地址为是一个常量 *cp=a; //正确,地址所指向的内容是一个普通字符 char *arr[3] = {"1","123","345"}; 如何识别,因为[]的优先级大于*,所以先是定义为一个数组,而后由*来修饰这个数 printf("arr0%cn",*arr[0]); printf("arr1%sn",arr[1]); char (*p)[3]; //申明时不能同时初始化 char arr[3] = {'1','4','7'}; p=&arr; //指向数组的首地址,同时指针的类型是char * [3] 类型的,即加1操作后为sizeof(char [3])三个字节数 如何识别:因为这次添加了一个显示优先,所以这次先是一个指针,而后[]修饰指针 printf("%cn",(*p)[0]); //先取arr的首地址,再根据这个地址取数组内容 printf("%cn",(*p)[1]); printf("%cn",(*p)[2]); printf("%cn",*((char*)p+0)); //先转换为char指针,再取值 printf("%cn",*((char*)p+1)); printf("%cn",*((char*)p+2)); printf("%cn",((char*)p)[0]); //先转换为char指针,再取数组的值,和第一个类似 printf("%cn",((char*)p)[1]); printf("%cn",((char*)p)[2]); 函数指针: char (*func)(void); //定义函数指针 char test(void) { return 'A'; } func = test; //初始化赋值 printf("test address: %pn",test); printf("func address: %pn",func); char ch = func(); //调用 printf("%cn",ch); 如何识别,同数组指针一样,因()的优先级,所以这个定义首先是一个指针,而后才是对指针的描述,即一个指向函数的指针,其指向的函数也是规定的:即返回的是字符类型,不需要传入参数 char *func(void); 如何识别,因为没有扩弧,所以*的优先级没有右边的扩弧优先级高,所以先是规定了一个函数,*只是修饰返回值的 char *func(void) { char *str = "test"; return str; } void main() { char *test = func(); printf("%sn",test); } int *a,*b; a=new int(10); //给指针赋值 b=new int(20); //a=0x00030828,b=0x00030840 a=(int*)(b-a); //a=0x00000006 b=(int*)(b-int(a)); //b=0x00030828 a=(int*)(b+int(a)); //a=0x00030840 只是交换变量的话也可以: int a = 4; int b = 5; *(((char*)&a)+1) = *((char*)&b); *((char*)&b)=*((char*)&a); *((char*)&a)=*(((char*)&a)+1); *(((char*)&a)+1)=0; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |