函数和指针

来源:互联网 发布:网络台球赌博 编辑:程序博客网 时间:2024/06/16 15:11
【1】GDB调试
            gcc -g test.c -o test
            gdb ./test
            l                        查看文件
            b    n             设置断点
            info b     查看断点信息
            r                        程序运行起来
            n , s        查看变量的值
            q                     退出进程
            c                        继续运行
gcc 编译步骤
 1.预处理 -E
 2.编译  -S .s
 2.汇编 -c .o
 4.链接 


【2】指针数组
             本质是一个数组,数组中的每一个元素,都是一个指针(地址)。

    int a[10]; 
    int * p = a;

    int a[3][2];
    // a[0] , a[1], a[2]  代表三个一维数组, 移动一下,代表移动一个元素
    // a  代表 二维数组的数组名,数组的首地址(值相等),代表是首行的行地址。移动一下,代表移动一行。

    int * p[3];

二维数组
    int a[3],[2];
    int *p[3];
    p[0]=a[0];
    p[1]=a[1];
    p[2]=a[2];
    //a代表二维数组是数组名,数组的首地址,代表的是首行的行地址。移动一下代表移动一行。

【3】数组指针
  本质是一个指针,它指向一个数组。
     int a[3][2];
     int (* p)[m];   m的大小 取决于 二维数组的列的大小,m = 2;  
     p = a;
【4】公式
        一维数组:
     int *p;
     int  a[10];
     p = a;

    *(p+i) <==> p[i] <==> a[i] <==> *(a+i)

     二维数组:
     int  a[3][4];
     int (*p)[4];
     p = a;

     a[i][j] <==> *(a[i] + j) <==> *(*(a+i) + j) <==> *(p[i] + j) <==> *(*(p+i) + j) <==> p[i][j];




【5】内存的分区
            栈区 ,静态区 ,全局变量区 ,堆区 ,常量区。
           
         栈区:函数执行结束,栈空间释放。可读可写
             char str[32] = "hello world";  保存在数组中,数组在栈区。

     常量区:常量区中数据只读,不能进行修改。否则段错误。常量区只能在定义时申请。
             char * p = "hello world"  ;  常量区

             char * str1[3] = {"Beijing", "Wuhan", "Shanghai"};  //字符串, 保存常量区


使用指针实现字符逆序
实现字符的交换
1--使用temp
2--使用异或
3--使用加


【6】递归函数
        所谓递归函数就是指一个函数的函数体中直接调用或者间接调用自身的函数。
        递归函数必须拥有结束条件,否则是死循环。
函数申请的空间在栈上。递归函数非常耗费 栈空间。
   #include<stdio.h>
   int sum(int a)
   {
       int ret=0;
       if (a==1)
           return 1;
       ret = a * sum(a-1);
       return ret;
   }
  int main()
  {
      printf("%d \n",sum(5));
  }
              
运行过程






















0 0