指针总结

来源:互联网 发布:淘宝买家退货流程 编辑:程序博客网 时间:2024/06/06 01:43
  1. 指针变量总结
    1. 指针的含义
    指针就是地址。
    变量的指针就是变量的地址
    指针变量就是地址变量
    2. 区别指针和指针变量
    指针就是地址本身。
    指针变量用来保存地址的变量
    如:有人认为指针是类型名,指针的值是地址?类型是没有值得,只有变量才有值,正确说法是:变量的值是一个地址
    3. 什么叫指向
    地址就意味着指向。通过地址能找到具有该地址的对象
    并不是任何数据类型的地址都可以存放在指针变量中,只有和指针变量的基类型 相同的数据的地址才能存放在相应的指针变量当中。
    void* 特殊的指针,不指向任何类型的数据。如果需要用此地址指向某类型的数据,应对地址进行类型转换。
    显示转换或由编译器隐式转换
    4. 掌握对数组操作使用指针
    一维数组名代表数组首元素的地址
    变量定义 类型表示 含义
    int* p[5] int* [5] 指针数组,元素是指针,顺序念
    int (p)[5] int ()[5] p为指向5个整形元素的一维数组的指针变量
    int Fun() int () Fun为返回整形函数值的函数
    int p() int () p为返回一个指针的函数,该指针指向整形的数据
    int (p)() int ()() p为指向函数的指针,该函数返回一个整形值
    int** p int** p为一个指针变量,它是指向一个指向整形数据的指针变量
    void p void p为一个指针变量,基类型为void,不指向具体的对象
    5.指针运算
    指针的加减 ++ – += -=
    6.指针变量的赋值
    将一个变量地址赋给一个指针变量
    px = &a;
    px = array;
    px = &array[1]; //2维数组
    px = function;
    px = py ; //基本类型相同的指针变量
    7. 指针变量可以有空值
    初始化时不指向任何变量
    int *p ;
    int *p = NULL; //NULL 符号常量,代表整数0;#define NULL 0;
    int *p = 0;

  2. C编程动态内存分配及相关技术
    1.什么是内存动态分配
    又叫“寄存器变量”。
    全局变量分配在内存中的静态存储区,非静态的局部变量是分配在内存中的动态存储区,这个存储区叫“栈”stack
    除此之外,C语言允许建立内存动态分配区域,以存放一些临时用的数据。生命存在周期有限。自由存储区叫“堆”heap

    1. 怎么建立内存的动态分配
      主要函数有:calloc,free,malloc,realloc,
      A. malloc –在内存动态存储区中,分配一个长度为size的连续空间。
      void *malloc(unsigned int size);//函数原型
      如:malloc(1000);//临时分配域,不指向任何类型数据,只提供一个地址
      B. calloc – 在内存动态分配区,分配n个长度为size的连续空间,这个空间一般比较大,足够保存一个数组
      void *calloc(unsigned int n, unsigned int size);
      如:px = calloc (20,4);
      C. free – 释放指针变量p所指向的动态空间,使这部分空间重新被其他变量使用。
      void* free(void *p)
      如:free(p)
      D. realloc – 当已经通过malloc/calloc 获得动态空间,想改变其大小,可以用realloc重新分配
      void realloc(void p,unsigned int size);
      如:realloc(p,50);
  3. void *
    不要把“指向void*”理解为“能指向任何类型”,应理解为“指向空类型”或者“不指向确定的类型”
    如:
    int a =10000;
    int* pa = &a ;
    void* px ;
    px = (void*) pa;
    pa =(int *)px;
    工程实战—动态创建数组
    1维:
    2维:
/*对于构建一维动态数组,需要一维指针;对于二维, 需要一维,二维指针;三维 需要一,二,三维指针函数原型---《stdlib.h》void *malloc(unsigned int size);//如果此前该内存被分配过,则新分配内存不会初始化为0void *calloc(unsigned int num,  unsigned int size);//每次新分配内存都被初始化为0void free(void *p);void *realloc(void *p,unsigned int  size);*/#define _CRT_SECURE_NO_WARNINGS #include <stdio.h>#include <stdlib.h>int main(){int n1, i;int* array;puts("1:::输入一维数组的长度:");scanf("%d",&n1);array = (int*)malloc(n1*sizeof(int));for (i = 0; i < n1; i++){array[i] = i + 1;printf("%d\n", array[i]);}free(array);//system("pause");/////////2222维//////////////int n2, n3;int** array2;puts("2维:::请输入2维数组的1维长度");scanf("%d", &n2);puts("2维:::请输入2维数组的2维长度");scanf("%d", &n3);array2 = (int **)malloc(n2 * sizeof(int*));//第一维for (int i = 0;i <= n2;i++){array2[i] = (int *)malloc(n3 * sizeof(int));//第二维for (int j = 0;j < n3;j++){array2[i][j] = i + j;printf("--%d\n", array2[i][j]);}}//释放空间的层次for (int i = 0; i < n2; i++){free(array2[i]);}free(array2);///这一步报错???看到网上的教程都是这样写system("pause");return 0;}
原创粉丝点击