指针总结
来源:互联网 发布:淘宝买家退货流程 编辑:程序博客网 时间:2024/06/06 01:43
指针变量总结
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;C编程动态内存分配及相关技术
1.什么是内存动态分配
又叫“寄存器变量”。
全局变量分配在内存中的静态存储区,非静态的局部变量是分配在内存中的动态存储区,这个存储区叫“栈”stack
除此之外,C语言允许建立内存动态分配区域,以存放一些临时用的数据。生命存在周期有限。自由存储区叫“堆”heap- 怎么建立内存的动态分配
主要函数有: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);
- 怎么建立内存的动态分配
- 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;}