7月27日(函数与数组)

  1. 一、函数和指针

  2. 1. 函数指针(指向函数的指针)。 例如: int (*pf)( ); 
  3.     例:
  4.  
  5. #include <stdio.h>
  6.  
  7. void print()
  8. {
  9. printf("Hello\n");
  10. }
  11.  
  12. int add(int x, int y)
  13. {
  14. return (x+y);
  15. }
  16.  
  17. int main()
  18. {
  19. int m;
  20.  
  21. void (*p)();
  22. p = print;
  23. p();
  24.  
  25. int (*q)(int, int);
  26. q = add;
  27. m = q(1, 2);
  28.  
  29. printf("%d", m);
  30.  
  31. return 0;
  32. }
  33. 其中 p = print; 和 q = add;  是将地址赋值给指针,函数名就是一个地址;
  34. 2. 指针函数(指针里保存函数)。例如:int *p( );
  35.     例:
  36.  
  37. #include <stdio.h>
  38. #include <stdlib.h>
  39. #include <string.h>
  40.  
  41. char *Init()
  42. {
  43. char *tmp = (char *)malloc(sizeof(char)*10);
  44.  
  45. return tmp;
  46. }
  47.  
  48. int main()
  49. {
  50. char *str;
  51. str = Init();
  52.  
  53. strcpy(str, "hello");
  54.  
  55. printf("%s", str);
  56. return 0;
  57. }
  58. 其中 str = Init();是将函数赋给指针函数 ,等号两边等价。
  59. 3.练习(1)int     * ( * ( * fp ) ( int ) ) [10] ;
  60.                   * fp   // fp是一个指针
  61.                   * ( * fp ) ( int )   // 指针指向一个有int型参数的函数,函数的返回值是一个指针
  62.                   int     * ( * ( * fp ) ( int ) ) [10]   // 指针指向一个有10个元素的数组,数组中的每个元素都是int型的指针
  63.           (2)int   * ( * ( * array [5] )( ) ) ( ) ;
  64.                    * array [5]   // array是一个有五个元素的数组,每个元素都是一个指针
  65.                    * ( * array [5] )( )  // 每个指针指向一个函数,函数的返回类型是一个指针
  66.                    int   * ( * ( * array [5] )( ) ) ( ) ;  // 每个指针指向一个函数,函数的返回类型是一个int型指针
  67. 二、数组和指针

  68. 1. 指向二维数组的指针的表示方式 
  69. 表示形式

    含义

    地址值

    &a

    指向二维数组的指针

    1000

    a

    二维数组名,指向一维数组a[0],即第0行首地址

    1000

    a[0] , *(a+0) , *a

    0行第0列元素地址

    1000

    a+1 , &a[1]

    1行首地址

    1006

    a[1] , *(a+1)

    1行第0列元素地址

    1006

    a[1]+2 , *(a+1)+2 , &a[1][2]

    1行第2列元素地址

    1010

    *(a[1]+2) , *(*(a+1)+2) , a[1][2]

    1行第2列元素的值

    元素值为11

  70.  &a[i]或a+i指向行,而a[i]或*(a+i)指向列 
  71. 例:
  72.  
  73. #include <stdio.h>
  74.  
  75. int main()
  76. {
  77. int a[3][4] = {{1, 2, 3, 4}, {3, 4, 5, 6}, {5, 6, 7, 8}};
  78. int i;
  79. int (*p)[4] = a, *q = a[0];
  80.  
  81. for(i = 0; i < 3; i++)
  82. {
  83. if(i == 0)
  84. {
  85. (*p)[i + i/2] = *q + 1;
  86. }
  87. else
  88. {
  89. p++, ++q;
  90. }
  91. }
  92.  
  93. for(i = 0; i < 3; i++)
  94. {
  95. printf("%d,", a[i][i]);
  96. }
  97.  
  98. printf("\n");
  99. printf("%d,%d\n", *((int *)p), *q);
  100. return 0;
  101. }
  102. 其中int ( * p ) [ 4 ] = a ;p是指针,指向一个有4个元素的数组。因为a + 1是加一行(4个元素,16字节),所以p + 1也要加16个字节,数组中元素个数取4。
  103. 2. 二维数组指针
  104.  
  105. #include <stdio.h>
  106.  
  107. int main()
  108. {
  109. int i, j;
  110. int a[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
  111. int (*p)[4] = a;
  112.  
  113. for(i = 0; i < 3; i++)
  114. {
  115. for(j = 0; j < 4; j++)
  116. {
  117. printf("%d ", a[i][j]);
  118. printf("%d ", *(*(p + i) + j));
  119. printf("%d ", p[i][j]);
  120. printf("%d ", (*(p + i))[j]);
  121. }
  122. printf("\n");
  123. }
  124. return 0;
  125. }
  126. 其中 a[ i ] [ j ] === * ( * ( p + i) + j ) === ( * ( p + i ) ) [ j ] === p[ i ] [ j ]
  127. 三、指向指针的指针

  128. 例1:
  129.  
  130. #include <stdio.h>
  131. #include <stdlib.h>
  132. #include <string.h>
  133.  
  134. void MemoryInit(char **str)
  135. {
  136. *str = (char *)malloc(sizeof(char) * 64);
  137. }
  138. int main()
  139. {
  140. char *ptr = NULL;
  141.  
  142. MemoryInit(&ptr);
  143.  
  144. strcpy(ptr, "Helloworld");
  145.  
  146. printf("%s\n", ptr);
  147. return 0;
  148. }
  149. 函数传地址时 &ptr = **str; 其中ptr是指针也是地址,&ptr是地址的地址,**str也是地址的地址
  150.                                                  &ptr 是函数调用要传递地址(参见两数交换的程序) 
  151. 例2:
  152.  
  153. #include <stdio.h>
  154.  
  155. int main()
  156. {
  157. char *name[] = {"Follow", "BASIC", "Great", "For", "Computer"};
  158. char **p;
  159. int i;
  160.  
  161. for(i = 0; i < 5; i++)
  162. {
  163. p = name + i;
  164. printf("%s\n", *p);
  165. }
  166. return 0;
  167. }
  168. 定义时 name[ ]是数组名也是一个地址,*name[ ]是地址的地址,+1加到下一个元素 
  169.             **p也是地址的地址,所以p = name + i成立
  170. 输出时 *p是取值, 就少了一层地址,还剩一层地址,而数组本身就是一个地址,就相当于取数组的值
  171. 四、命令行参数(main函数的函数) 

  172. 1. main (int argc,char *argv[])
  173.              argc(第一个形参)必须是整型变量,表示参数的个数
  174.              argv( 第二个形参)必须是指向字符串的指针数组,表示具体的参数
  175. 2. 使用命令行参数编写字符串排序
  176.  
  177. #include <stdio.h>
  178. #include <string.h>
  179. #include <stdlib.h>
  180.  
  181. void sort(char *a[], int length)
  182. {
  183. int i, j;
  184. char *tmp;
  185.  
  186. for (i = 1; i <= length - 1; i++)
  187. {
  188. for (j = 1; j <= length - i - 1; j++)
  189. {
  190. //if (a[j + 1] < a[j])
  191. if (strcmp(a[j + 1], a[j]) > 0)
  192. {
  193. tmp = a[j + 1];
  194. a[j + 1] = a[j];
  195. a[j] = tmp;
  196. }
  197. }
  198. }
  199. }
  200.  
  201. void print(char *a[], int length)
  202. {
  203. int i;
  204. for (i = 1; i < length; i++)
  205. {
  206. printf("%s ", a[i]);
  207. }
  208. printf("\n");
  209. }
  210.  
  211. int main(int argc, char *argv[])
  212. {
  213. int i, j, tmp;
  214. int length = argc;
  215.  
  216. sort(argv, length);
  217.  
  218. print(argv, length);
  219.  
  220. return 0;
  221. }
  222.  运行时  ./sort.c aaa bbb ccc ddd (输入需要比较的字符串)
  223. 附上今日笔记:
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值