指针问题
Posted shuoed
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了指针问题相关的知识,希望对你有一定的参考价值。
1.普通变量的指针指向
2.指针对数组元素的访问
3.指针作为形参
4.指向结构体的指针变量作为函数参数
5.函数指针
6.指针函数(返回的类型为指针,具体返回什么类型的指针还要看返回值,下面列举的为字符指针,即返回指向字符的指针(地址))
7.指针的指针
8.略看....
9.二级指针示例:
下附代码:
1 #include<stdio.h> 2 typedef struct { 3 char name[20]; 4 int age; 5 } stu; 6 void output(stu *p) { 7 int i,j; 8 for(i=0; i<3; i++) { 9 for(j=0; j<strlen(p[i].name); j++) { 10 printf("%c",p[i].name[j]); 11 } 12 printf(" %d\\n",p[i].age); 13 } 14 } 15 void show03() { 16 /*指针对结构体的操作*/ 17 stu gro[3]= { {"zhangsan",15},{"lisi",18},{"wangwu",55} }; 18 stu *p=gro; 19 output(p); 20 } 21 void show() {/*普通变量指针的应用*/ 22 int a=3; 23 int *p; 24 p=&a; 25 printf("a -> %p=%d || p -> %p=%d\\n",&a,a,p,*p); 26 } 27 void show01() { 28 /*指针对数组的应用,测试了两种类型的数组,一种字符数组(两个一个字符串常量,一个字符数组)、 29 一种整型数组,通过while变量的结果我们可以看出点不同,字符串常量,指针指向后可以判别字符 30 串长度,而对于数组不行,我们利用循环对数组遍历时需自己判断指针所指位置是否超出数组范围, 31 这里还有一个知识点,通过显示的结果我们可以看到字符串常量和字符数组的内存位置是连续的。 32 */ 33 char str[]="he wo!"; 34 char str1[]= {\'w\',\'x\',\'s\',\'z\',\'!\',}; 35 int num[4]= {12,14,16,18}; 36 37 char *st=str; 38 char *sr=str1; 39 40 int *p_f,*p_e;//定义两个整形指针 41 p_f=num; 42 p_e=p_f+3;//指向数组首、尾 43 printf("num -> %p=%d || p_f -> %p=%d\\n",num,*num,p_f,*p_f); 44 printf("num[3] -> %p=%d || p_e -> %p=%d\\n",&num[3],num[3],p_e,*p_e); 45 46 puts(">>>>>>"); 47 while(*st) { 48 printf("%c %p\\n",*st,st); 49 st++; 50 } 51 puts(">>"); 52 while(*sr) {//会有问题,回超出数组范围 53 printf("%c %p\\n",*sr,sr); 54 sr++; 55 } 56 puts(">>"); 57 while(*p_f) { //会有问题,回超出数组范围 58 printf("%d %p\\n",*p_f,p_f); 59 p_f++; 60 } 61 puts(">>>>>>"); 62 } 63 void swap(int *a,int *b) { 64 /*利用指针交换两个数,注意传的是a,b的地址,在 65 形参中用指针接受,将两个数交换即对a,b地址中所 66 记录的数进行处理,所有在调用后会对原有数据进 67 行修改*/ 68 printf("\\t a -> %p b -> %p\\n",a,b); 69 *a =*a ^ *b; 70 *b =*b ^ *a; 71 *a =*a ^ *b; 72 } 73 void show02() {/*指针在函数参数中的应用*/ 74 int a=2,b=0; 75 printf("交换前 :a -> %p=%d b -> %p=%d\\n",&a,a,&b,b); 76 swap(&a,&b); 77 printf("交换后 :a -> %p=%d b -> %p=%d\\n",&a,a,&b,b); 78 } 79 80 81 void function() { 82 printf("I\'m function.\\n"); 83 } 84 void show04() { 85 /*指针对函数的操作*/ 86 void (*p_function)(); 87 p_function=function; 88 (*p_function)(); 89 } 90 char* finger() { 91 char *x="123456";//定义字串常量 92 //char x[5]="12345";切记这样,数组属于局部变量,函数调用后数组即被释放故无法返回其数组的地址 93 printf("%s\\n",x); 94 return x; 95 } 96 void show05() { 97 /*调用指针函数*/ 98 printf("%s\\n",finger()); 99 } 100 void show06() { 101 /*指针的指针*/ 102 int i; 103 char *a[]= {"zhangsan","lisi","wangwu"}; 104 char **p=a; 105 for(i=0; i<3; i++) 106 printf("%s\\t",p[i]); 107 p=&a[1]; 108 printf("\\n%s\\n",*p); 109 p=a; 110 for(i=0; i<3; i++) 111 printf("%s\\t",*(p+i)); 112 printf("\\n%c\\n",*(*(p+1)+2));//访问第二行第三列 113 } 114 void show07() { 115 /*指针对多维数组的操作*/ 116 char ca[2][2][2]= { 117 { 118 {\'a\',\'b\'}, 119 {\'c\',\'d\'}, 120 }, 121 { 122 {\'e\',\'f\'}, 123 {\'g\',\'h\'} 124 } 125 }; 126 int i,j,k; 127 char *p; 128 p=ca; 129 for(i=0; i<2; i++) 130 for(j=0; j<2; j++) 131 for(k=0; k<2; k++) 132 printf("%p-%c\\n",&ca[i][j][k],ca[i][j][k]); 133 printf("%p--%p\\n",&ca[0][0][0],p); 134 for(i=0; i<8; i++) 135 printf("%c",*p),p++; 136 } 137 int main() { 138 139 puts("-------------------------------00"); 140 show(); 141 puts("-------------------------------01"); 142 show01(); 143 puts("-------------------------------02"); 144 show02(); 145 puts("-------------------------------03"); 146 show03(); 147 puts("-------------------------------04"); 148 show04(); 149 puts("-------------------------------05"); 150 show05(); 151 puts("-------------------------------06"); 152 show06(); 153 puts("-------------------------------07"); 154 show07(); 155 return 0; 156 }
以上是关于指针问题的主要内容,如果未能解决你的问题,请参考以下文章