指针问题

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
",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
",&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
",num,*num,p_f,*p_f);
 44     printf("num[3] -> %p=%d || p_e -> %p=%d
",&num[3],num[3],p_e,*p_e);
 45 
 46     puts(">>>>>>");
 47     while(*st) {
 48         printf("%c %p
",*st,st);
 49         st++;
 50     }
 51     puts(">>");
 52     while(*sr) {//会有问题,回超出数组范围
 53         printf("%c %p
",*sr,sr);
 54         sr++;
 55     }
 56     puts(">>");
 57     while(*p_f) { //会有问题,回超出数组范围
 58         printf("%d %p
",*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("	 a -> %p   b -> %p
",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
",&a,a,&b,b);
 76     swap(&a,&b);
 77     printf("交换后 :a -> %p=%d b -> %p=%d
",&a,a,&b,b);
 78 }
 79 
 80 
 81 void function() {
 82     printf("I'm function.
");
 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
",x);
 94     return x;
 95 }
 96 void show05() {
 97     /*调用指针函数*/
 98     printf("%s
",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	",p[i]);
107     p=&a[1];
108     printf("
%s
",*p);
109     p=a;
110     for(i=0; i<3; i++)
111         printf("%s	",*(p+i));
112     printf("
%c
",*(*(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
",&ca[i][j][k],ca[i][j][k]);
133     printf("%p--%p
",&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 }
原文地址:https://www.cnblogs.com/A--Q/p/6001474.html