*指针的基础学习*

来源:互联网 发布:上瘾网络剧韩国 编辑:程序博客网 时间:2024/06/05 23:54

  
  计算机内存是由若干个1个字节的内存单元组成的存储器,计算机为了管理内存单元,给每个字节进行编号.编号就是地址.也就是指针
  
  而C语言函数调用都是值传递,在实参复制给形参的同时,实参并没有发生改变,所以才会有了传递地址就行修改主调函数实参的方法.(& 变量, * 指针变量).
  
  也正因如此,指针具有很高的灵活性,也可以说是星星的艺术.
  
  指针:
  
  如果指针存放某个基本数据类型变量的地址,那么该指针就指向这个基本数据类型变量的内容.我们就称之为一级指针.
  
  int a = 3;
  int *p = &a;
  
   1) 多个指针可以指向同一个变量
  
   2) 指针的指向是可以改变的.
  
   3) 指针定义的同时就好就初始化,空指针赋值为0或者NULL,表示谁都不指.未初始化的指针是垃圾值,容易导致系统崩溃.
  
   4) 指针在函数调用的时候可以有多个返回值.
  #include <stdio.h>
  
  void jiSuan(int num1, int num2, int *pjia, int *pjian, int *pcheng, double *pchu)
  {
      *pjia = num1 + num2;
      *pjian = num1 - num2;
      *pcheng = num1 * num2;
      *pchu = num1 * 1.0 / num2;
  }
  int main(int argc, const char * argv[]) {
     
      int a = 10;
      int b = 3;
      int jia, jian, cheng;
      jia = jian = cheng = 0;
      double chu;
      jiSuan(a, b, &jia, &jian, &cheng, &chu);
      printf("%d-%d-%d-%.2f\n", jia, jian, cheng, chu);
  
      return 0;
  }
   
  5) 为什么指针在64位系统中都是8个字节.指针的大小根据处理器来决定的.64位系统的cpu每次处理64位,也就是8个字节.
  
  6) 为什么8个字节的指针要定义成不同类型,因为指针所指向的是变量的首地址,只有根据变量类型的长度才能完整的找到变量内容.
  7) 指针可以相减,比较大小,前提是2个指针必须指向同一个数组.p1>p2说明p1的地址高.
  相减为0表示指向同一个地址.但是不能相加,会溢出,产生垃圾值.
  8) const 在 * 的左边, 指针指向可以改变(P的值可改)
                            指针所指向的内容不能改(*p不能改)
      const在 * 的右边,相反
      const 左右俩边都有,都不能改.
  
      
  
  
   字符数组 和 字符串 和 字符串指针:


  char cArr[] = {'H','E','L','L','O'};

这种字符数组形式初始化 sizeof长度为5 数组元素中并没有\0

类似其他基本类型的数组,数组元素是几个字节就是几个字节.

int a[] = {1,2,3,4,5};
    printf("%ld\n", sizeof(a) / sizeof(int));


char sArr[] = "hello";

这种字符串形式初始化   sizeof长度为6,多一个\0字符.数组元素中有\0

用strlen 计算长度都是5.说明只计算可见字符. 字符串形式不计算NULL字符
  
  
字符串指针:

字符串指针 本身是 一个指针变量,指向字符串的首地址.
而字符串    本身是 依该地址为首存的一段连续的内存空间并以\0为止的集合,也可以理解为字符数组.


    char *p = "hello world";
    可以写为
    char *p; // 一般初始化的同时就赋值.
    p = "hello world";
   
    但是字符数组不能这样写
    char a[20];
    a = "hello world”; // a是字符数组地址常量,不能记进行赋值.


  
    
  二级指针:
  
  如果指针存储的是另一个指针变量的地址,那么这个指针就是二级指针.
  
  int a = 3;
  int *p = &a;
  int **pp = &p;
  或者
  int a = 3;
  int *p = &a;
  int *pp = p;
  
  指针与一维数组
  
  数组指针是指向数组中元素的指针变量.
  
  int a[3] = { 1, 3, 5};
  int *p = a; 或者 int *p1 = &a[0];
  
  数组首元素的地址就是数组的地址
  
  *(a+i) = *(p+i) = a[i];
  
  指针变量可以++,但是数组名不能++,只能+常量.
  
  指针++,指针内存的地址会改变,即指向改
  
  指针数组是数组里的元素是指针,或者说是地址的集合.
  Int *p1[10];
  因为[]的运算级比*高,所以p1先和[10]结合成为数组,p1是数组名,然后int *是类型,指的是存储10个int类型的指针变量.所以这个是指针数组. 
  
  
  指针与二维数组
  上面一维指针数组的元素值可以通过*(a+i) = (p+i) = a[i]来得到,也就是可以用一个[]或者一个*来实现.
  那么就可以推理出 表示二维指针数组的元素值就可以通过2个*或者一个*加一个[]或者2个[]来表示.
  
  其余的方法只能得到数组元素的地址.
  

  

  
  通过以上可以总结,二维数组指针可以用
  *(*(a+i)+j)来取值

  *(*(a+i)+j) = *(*(p+i)+j) = *(a[i]+j) = (*(a+i))[j] = a[i][j] = p[i][j]

0 0
原创粉丝点击