黑马程序员技术交流社区

标题: 指针基础个人笔记(2) 仅供交流 [打印本页]

作者: muyan091115    时间: 2016-5-17 23:16
标题: 指针基础个人笔记(2) 仅供交流
9,指针为什么要分类型

   1),指针变量也是一个变量,也在内存中占据字节空间
           无论什么类型的指针变量 都占8个字节

   2),为什么要分类型
           因为指针只能找到变量的低字节的地址
           但是不知道操作几个字节的空间
           定义类型 好知道操作几个字节 int 4 float 4 char 1 double 8

           所以,一个变量指针职能存储和指针同类型的变量的地址
           否则就会出错,通过指针操作的时候,会变多变少得读取字节数。


10,指针与整数的加减法

   1),指针可以和整数相加减

           int num = 10;
           int *p1 = #
           int *p2 = p1 + 1; (结果加了4个字节)(int是4个字节)

           +1 不是指加一个字节 而是指加该类型占用的字节数

   2),+ - 整数 = + - 整数*(类型占据的字节数)


11,指针与一维数组

   int *p1 = arr;

   遍历数组

   1),第一种
      int *p1 = arr;
      for(int i = 0; i < length; i++){
          printf(“%d”,*(p1+i));
       }

   2),第二种
       for(int i = 0; i < length; i++){
          printf(“%d”,*(arr+i));
       }

   3),第三种
      int *p1 = arr;
      for(int i = 0; i < length; i++){
          printf(“%d”,*(p1++));
       }                                            
       这种遍历方式 结束时 会改变p1代表的变量
      不再指向第1个元素 ,而是最后一个元素
       不能进行第二次变量
       解决:重新赋值 int *p1 = arr;

   4),第四种
      arr代表数组的地址,所以不能更改arr

   当函数的参数是一个数组的时候
   在声明这个参数的时候,其实并不是创建一个数组
   而是声明一个用来存储数组地址的指针变量

   所以在函数的内部 是无法算出参数数组的长度

   规范:如果函数的参数是一个数组,在声明参数的时候,不要写数组
            而是写一个存储数组地址的指针变量

   void test(int arr[], int length){}  ❌
   void test(int * arr, int length){}  ✅
   虽然效果一样 但是都是下面这样写的


12,指针数组

   用来存储多个指针类型数据的数组
   int * ps[4];


13,用指针访问二维数组

   int a[][];
   a[j] = *(*(a+i)+j)


14,二维数组指针定义 初始化

   数据类型(*指针变量名)[二维数组列数]

   int a[3][4];
   int (*p)[4];   定义一个数组指针 指向含4个元素的一维数组
   p = a;
   p++; 这时候 不是指向下一个元素 而是指向下一行


15,指针数组和俄日维数组指针的区别

   int *pa [3]; 指针数组 存的是3个指针元素

   int (*pa)[3]; 二维数组指针 :指向含3个元素的一维数组


16,字符串指针保存字符串

   char * p1 = &ch                    指针指向字符
   char * p2 = “sdhkfsudhflskdj”  指针指向字符串

    字符串指针:
       定义:char *字符串指针变量名 = “字符串内容”
       作用:用来保存字符串

       这个字符串存储在常量区

   1),使用字符数组来保存的字符串是保存在栈里面的 可读可写。
   2),使用字符指针来保存字符串,保存的是字符串常量地址,常量区市只读的
           不可以修改

     char *str2 = NULL;
     str2 = malloc(100);
     scanf(“%s”,str2);
     printf(“%s/n”,str2);


17,二位字符数组

    char str3[][];


18,char类型的指针数组

   char * name[3]={“asd”,“dsf”,“fdasf”};







欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2