// // main.c // 指针高级 // // Created by zhangxueming on 15/6/4. // Copyright (c) 2015年 zhangxueming. All rights reserved. // #include <stdio.h> //指针的数组(指针数组) //本质是数组, 数组中的每一个元素都是指针变量 //int *p[10]; //p[0]~p[9] 都是一个 int *指针变量 //定义一个一维字符指针数组,并利用不定数量(不多于10)个字符串将其初始化,然后将各字符串输出。 //比如: //输入 //asdfw uuio fff tyu // //输出为 //tyu //fff //uuio //asdfw //str[0] //char str[10][100]--> char [100] --> char * //int main(int argc, const char * argv[]) { // char *ps[10]={NULL}; // char str[10][100]={};//str[0] &str[0][0] char * // int cnt=0; // for (int i=0; i<10; i++) { // ps[i]= str[i]; // scanf("%s",ps[i]); // cnt++; // if (getchar()==' ') { // break; // } // } // for (int i=0; i<cnt; i++) { // printf("%s ", ps[i]); // } // return 0; //} #include <stdlib.h> //int main(int argc,const char *argv[]) //{ // char *ps[10]={NULL}; // int cnt=0; // for (int i=0; i<10; i++) { // ps[i]=(char *)malloc(100*sizeof(char)); // if (!ps[i]) { // return -1; // } // scanf("%s", ps[i]); // cnt ++; // if (getchar()==' ') { // break; // } // } // for (int i=0; i<cnt; i++) { // printf("%s ", ps[i]); // free(ps[i]); // ps[i]=NULL; // } // return 0; //} //利用指针数组求二维数组元素的和 //int sum(int *p[], int len1, int len2) //{ // int sum=0; // for (int i=0; i<len1; i++) { // for (int j=0; j<len2; j++) { // //sum+=p[i][j];// p[i][j] --> *((*(p+i))+j) // //sum+=(*(p+i))[j]; // sum += *((*(p+i))+j); // } // } // return sum; //} // //int main(int argc,const char *argv[]) //{ // int a[3][2]={1,2,3,4,5,6}; // // int *p[3]={NULL}; // for (int i=0; i<3; i++) { // p[i]=a[i]; // } // printf("sum = %d ", sum(p,3,2)); // // return 0; //} //数组的指针(数组指针) //数组类型的指针,本质是指针变量,数据类型是数组类型的 //int (*p)[3]; --> int (*)[3] int [3] //p是一个向有三个元素的一维数组的指针 //&a[0] //int a[5][4]<==> int (*&a[5])[4] --> int (*)[4] //a[0] //int a[5][4]--> int a[0][4] --> int [4] --> int * //a //int a[5][4] --> int [5][4] --> int (*)[4] //&a //int a[5][4] <==> int (*&a)[5][4] --> int (*)[5][4] //&a[0][0] --> int * //int main(int argc,const char *argv[]) //{ // //printf("size = %ld ", sizeof(int [5])); // // int a[5][4]={}; // int (*p)[4]=a;//int (*)[4] int * // // printf("%p ",p); // p++; // printf("%p ",p); // p++; // printf("%p ",p); // // return 0; //} //传递一维数组的指针 int sum1(int(*p)[2], int len)// *(int (*p)[2]) --> int [2] { int sum=0; for (int i=0; i<len; i++) { for (int j=0; j<2; j++) { //sum+=p[i][j]; //sum+= (*(p+i))[j]; sum+=*(*(p+i)+j); } } return sum; } //传递二维数组的指针 int sum2(int (*p)[3][2])//*p int [3][2] --> int (*)[2] { int sum=0; for (int i=0; i<3; i++) { for (int j=0; j<2; j++) { //sum+= (*p)[i][j]; sum+= *(*(*p+i)+j); } } return sum; } //int main(int argc, const char *argv[]) //{ // int a[3][2]={1,2,3,4,5,6}; // //printf("sum = %d ", sum1(a,3)); // printf("sum = %d ", sum2(&a)); // // return 0; //} //函数的指针 //函数类型的指针 //int (*pfunc)(int , int)=add; ---> int (*)(int,int) //int (*pfunc)(void); //void (*pfunc)(void); //函数名是函数指针类型的 int add(int a, int b) { return a+b; } int sub(int a, int b) { return a-b; } //int main(int argc, const char *argv[]) //{ // //printf("add = %p ", add); // //printf("sum = %d ", add(3, 5)); // int (*pfunc)(int , int)=add; // // printf("sum = %d ", pfunc(3,5)); // // pfunc = sub; // // printf("sub = %d ", pfunc(9,5)); // // return 0; //} //函数指针数组 //int (*p[5])(int , int); void run(void) { printf("狗在奔跑 "); } void eat(void) { printf("狗在肯骨头 "); } void sleeping(void) { printf("狗在睡觉 "); } void bark(void) { printf("狗在咬人 "); } void tail(void) { printf("狗在摇尾巴 "); } #include <string.h> //int main(int argc, const char *argv[]) //{ // char order[20]={}; // scanf("%s", order); // char *strAction[5]={"run","eat","sleeping","bark","tail"}; // void (*dogAction[5])(void)={run,eat,sleeping,bark,tail}; // // for (int i=0; i<5; i++) { // if (strcmp(order, strAction[i])==0) { // dogAction[i](); // } // } // return 0; //} //回调函数 void print_hello(void) { printf("hello "); } void print_world(void) { printf("world "); } void print_welcome(void) { printf("welcome "); } void print(void(*pfunc)(void), int cnt) { for (int i=0; i<cnt; i++) { pfunc(); } } //int main(int argc,const char *argv[]) //{ // print(print_hello, 5); // print(print_welcome, 4); // print(print_world, 5); // // return 0; //} //定义一个一维字符指针数组,并利用不定长字符串将其初始化,最后一段字符串以‘@’结尾,然后将各字符串输出. //比如: //输入 //asdfw //dffweff@ //输出为 //asdfw //dffweff // //输入 //sgfge //asdfwwr //wwdfaf@ //输出为 //sgfge //asdfwwr //wwdfaf unsigned long my_strlen(char *str) { int i=0; while (str[i]) { i++; } return i; } //int main(int argc,const char *argv[]) //{ // //printf("len = %lu ", my_strlen("hello")); // // char *ps[10]={NULL}; // int cnt=0; // for (int i=0; i<10; i++) { // ps[i]=(char *)malloc(100*sizeof(char)); // if (!ps[i]) { // return -1; // } // scanf("%s", ps[i]); // int len = (int)my_strlen(ps[i]); // if (ps[i][len-1]=='@') { // ps[i][len-1]=' '; // } // cnt++; // if (getchar()==' ') { // break; // } // } // // for (int i=0; i<cnt; i++) { // printf("%s ", ps[i]); // free(ps[i]); // ps[i]=NULL; // } // return 0; //} //指针函数 //函数的返回为指针类型的函数 //#include <string.h> // //int main(int argc,const char *argv[]) //{ // //char *strcpy(char *dst, const char *src); // return 0; //} //二级指针(指向指针的指针) //int a=100; //int *p = &a; //int **q = &p; //int main(int argc,const char *argv[]) //{ // int a=100; // int *p = &a; // int **q = &p; // // printf("&a = %p ", &a); // printf("&a = %p ", p); // printf("&a = %p ", *q); // // printf("a = %d ", *p); // printf("a = %d ", a); // printf("a = %d ", **q); // // return 0; //} //利用二级指针交换两个变量的值 void swap(int **a, int **b) { int temp = **a; **a = **b; **b = temp; } int main(int argc,const char **argv) { int a=10, b=20; int *pa= &a; int *pb= &b; swap(&pa, &pb); printf("a = %d b = %d ", a, b); return 0; }