main.c文件
//
// main.c
// IOS150604
//
// Created by Peng Junlong on 15/6/4.
// Copyright (c) 2015年 Peng Junlong. All rights reserved.
//
//*************************
//* *
//* 高级指针 *
//* *
//*************************
#include <stdio.h>
//指针的数组(指针数组)
//本质是数组,数组中的每一个元素都是一个指针变量
//int *p[10];保存地址
//p[0]~p[9]都是一个int * 指针
//输入单词并输出
//使用栈内存
//int main(int argc, const char * argv[]) {
// char *ps[10] = {NULL};
// int count = 0;
// char str[10][100]; // 让指针数组中的每一个指针都指向一个地址
// for(int i=0;i<10;i++)
// {
// ps[i] = str[i]; //若无此语句则指针ps[i]不指向任何地址
// scanf("%s",ps[i]);
// count++;
// if (getchar() == '\n') {
// break;
// }
// }
// for (int i=0; i<count; i++) {
// printf("%s\n",ps[i]);
// }
// return 0;
//}
//使用堆内存
//#include <stdlib.h>
//int main(int arg , const char *argv[])
//{
// char *ps[10] = {NULL};
// int count = 0;
// for(int i=0;i<10;i++)
// {
// ps[i] = (char *)malloc(100*sizeof(char));
// if (!ps[i]) {
// return -1;
// }
// scanf("%s",ps[i]);
// count++;
// if (getchar() == '\n') {
// break;
// }
// }
// for (int i=0; i<count; i++) {
// printf("%s\n",ps[i]);
// free(ps[i]);
// ps[i] = NULL;
// }
// return 0;
//}
//利用指针数组求二维数组元素的和
//int sum(int *array[],int rlength,int clenght)//*array[]也可写成**array
//{
// int sum = 0;
// for (int i=0; i<rlength; i++) {
// for (int j=0; j<clenght; j++) {
// sum += array[i][j];
//// sum += (*(a+i)[j]);
//// sum += *(*(a+i)+j);
// }
// }
// return sum;
//}
//int main(int arg ,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\n",sum(p, 3,2));
// return 0;
//}
//数组的指针(数组指针)
//数组类型的指针,本质是指针变量,数据类型是数组类型的
//int (*p)[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+1表示二维数组的下一行(即下一个一维数组的首地址)
//&a
//int a[5][4] -->int (*&a)[5][4] -->int (*)[5][4] // 二维数组指针
//&a[0][0]-->int *
//传递一维数组的指针
//int sum1(int (*p)[4],int rlenght) //
//{
// int sum =0;
// for (int i=0; i<rlenght; i++) {
// for (int j=0; j<4; j++) {
// sum += *(*(p+i)+j);
// }
// }
// return sum;
//}
//
////传递二维数组的指针
//int sum2(int (*p)[3][4]) //*p类型是int [3][4] -->int (*)[4];一维数组的指针
//{
// int sum = 0;
// for (int i=0; i<3;i++) {
// for (int j=0; j<4; j++) {
// sum += *(*(*p+i)+j);
// }
//
// }
// return sum;
//}
//int main(int arg ,const char *argv[])
//{
// int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
// int (*p)[4];
// for (int i=0; i<3; i++) {
// p = a+i;
// printf("%p\n",p); //每加1地址加4*4个字节
// for (int j=0; j<4; j++) {
// printf("%d\n",*(*p+j));
// }
// }
// printf("Sum = %d\n",sum1(a, 3));
// printf("Sum = %d\n",sum2(&a));
// return 0;
//}
functionPointer.c文件
//
// functionPointer.c
// IOS150604
//
// Created by Peng Junlong on 15/6/4.
// Copyright (c) 2015年 Peng Junlong. All rights reserved.
//
#include <stdio.h>
//*************************
//* *
//* 函数指针 *
//* *
//*************************
//函数指针 (一定要掌握)
//函数类型的指针
//int (*pfunc)(int ,int) -->函数指针的类型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 arg,const char *argv[])
//{
// int a = 10;
// int b = 20;
// int (*pfunc)(int ,int) = add;
// printf("%d\n",add(a,b));
// printf("%p\n",add);
// printf("%p\n",pfunc);
// printf("%d\n",pfunc(a,b));
// pfunc = sub;
// printf("%d\n",pfunc(a,b));
// return 0;
//}
//函数指针数组
//int (*pfunc[5])(int,int)
//#include <string.h>
//
//void run(void)
//{
// printf("狗在跑\n");
//}
//
//void eat(void)
//{
// printf("狗在吃\n");
//}
//void sleeping(void)
//{
// printf("狗在睡觉\n");
//}
//void bark(void)
//{
// printf("狗在叫\n");
//}
//void tail(void)
//{
// printf("狗在摇尾巴\n");
//}
//int main(int arg ,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])) {
// dogAction[i]();
// }
// }
//
// return 0;
//}
//回调函数:用函数指针作为形参来调用其他函数
//回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,
//当这个指针被用来调用其所指向的函数时,我们就说这是回调函数
//void print_Hello(void)
//{
// printf("Hello\n");
//}
//void print_World(void)
//{
// printf("World\n");
//}
//void print_Welcome(void)
//{
// printf("Welcome\n");
//}
//
//void print(void (*p)(void),int count)
//{
// for (int i=0; i<count; i++) {
// p();
// }
//}
//int main(int arg ,const char *argvp[])
//{
// print(print_Hello,2);
// print(print_World,3);
// print(print_Welcome,4);
// return 0;
//}
#include <stdlib.h>
//最后一个字符以@结束
//unsigned long my_strlen(char *str)
//{
// int i=0;
// while (str[i] != '\0') {
// i++;
// }
// return i;
//}
//
//int main(int arg ,const char *argv[])
//{
// char *pstr[10]={NULL};
// int count =0;
// for (int i=0; i<10; i++) {
// pstr[i] = (char *)malloc(100*sizeof(char));
// if(!pstr[i])
// {
// return -1;
// }
// scanf("%s",pstr[i]);
// int len = (int)my_strlen(pstr[i]);
// if (pstr[i][len-1] == '@') {
// pstr[i][len-1] = '\0';
// }
// count++;
// if(getchar() == '\n')
// break;
// }
// //printf("%d\n",(int)my_strlen("hello"));
// for (int i=0; i<count; i++) {
// printf("%s\n",pstr[i]);
// }
//
// return 0;
//}
//二级指针(指向指针的指针)
//int a = 100;
//int *p = &a;
//int **q = &q;
//int main(int arg ,const char *argv[])
//{
// int a = 100;
// int *p = &a;
// int **q = &p;
// printf("%p\n",&a);
// printf("%p\n",p);
// printf("%p\n",*q);
//
// printf("%p\n",&p);
// printf("%p\n",q);
//
// printf("%d\n",a);
// printf("%d\n",*p);
// printf("%d\n",**q);
// return 0;
//}
//应用二级指针交换两个变量的值
//void swap(int **a,int **b)
//{
// int temp;
// temp = **a;
// **a = **b;
// **b = temp;
//}
//
//int main(int arg ,const char *argv[])
//{
// int a = 100;
// int b = 200;
// int *pa = &a;
// int *pb = &b;
// printf("a = %d,b=%d\n",a,b);
// swap(&pa,&pb);
// printf("a = %d,b=%d\n",a,b);
// return 0;
//}