关于指针的各类事项
指针
-
“ & ” 取地址符
后跟一个变量名时,&给出该变量的地址,&不能对没有地址的东西取地址。例如:&(a+b)就是错误的。 -
指针的本质就是保存地址的变量
int i;
int *p = &i;
普通变量的值是实际的值。
指针变量的值是具有实际值的变量的地址。
指正做参数时可以通过指针访问更改其变量(地址传递)。 -
“ * ” 操作符
“ * ”是一个单目运算符,用来访问指针的值所表示的地址上变量,可以做右值也可以做左值。
int k = *p;
*p = k + 1; -
指针声明
指针声明变量是必须指定指针所指向变量的类型
例如:int *prt;
“ * ”说明声明的变量是指针类型,它指向的变量类型是int型多级指针的声明
例如:int *p1,*p2,*p3; p1,p2,p3都是int指针类型
int *p1,p2,p3; p1是int指针类型而p2,p3是int型
指针指向类型对大小的影响:p++,ch++ -
指针初始化
1)声明时初始化:
int a;
int *p = &a;
2)声明后复制:
int a;
int *p;
p = &a;
3)同类指针赋值:
int a;
int *p = &a;
int *q = p;
3)void指针赋值:
int a;
int *p;
void *q = p;
printf("%d\n", (int *)q); -
指针对变量的操作
1)访问
2)更改 -
如何使用指针解决函数间的通信问题
答:
1)交换两个变量的值。
2)函数返回运算的状态,结果通过指针返回。
常用的套路是让函数返回特殊的不属于有效范围内的值来表示出错:-1或0。 -
指针的常见错误
1)定义了指针变量,还没有指向任何变量,就开始使用指针或者指针使用完指向NULL以后,直接调用(野指针,造成段错误)
2)不同指针类型直接赋值(viod * 除外)
3)返回一个局部变量 -
一维数组与一级指针
1)数组变量是特殊指针
2)数组变量本身表达地址,所以
例如:int a[10]; int *p = a;
3)但是数组的单元表达式变量,需要用到" & "取地址符号
例如:int a == &a[0];
[ ] 运算符可以对数组做,也可以对指针做;
例如:p[0] == a[0];
*运算符可以对指针做,也可以对数组做
例如:*a = 25; 或 * p = 25;
数组变量是const的指针,所以不能被赋值
例如:int a[ ] == int *const a;
-
指针常量与常量指针
看const修饰在*前还是后。
1)const在前是常量指针,也可以叫常指针。
注意:不能通过这个张子贞去修改变量,但可以更改指针指向。
例如:int i,j; consst int *p = &i; p = &j;
2)const在后是指针常量
能通过这个指针去修改那个变量,但是不可以更改指针的指向(数组是指针常量)
例如:int i; int *const q = &i; *q = 26;
-
常量指针常量
1)双重制度,指针不可改变,指向的目标数据对象也不可改变。
例如:int n = 10,m = 30; const int *const p = &n;
只能读,不能其他操作
2)用const修饰的数组是常量指针常量
例如:const int num[128] = {1};
-
内存的动态申请
1)栈空间与堆空间
栈空间是系统自动申请自动释放
堆空间是用户自己申请自己释放
2)堆申请用void *malloc(size_t size);
函数
/******************************************
* 头文 件:#include <stdio.h>
* 功 能:在堆空间申请一个类型的空间,成功返回头地址,失败返回NULL
* 函 数:void *malloc(size_t size)
* 注意:该函数与void free(void *ptr)配对使用
******************************************/
/*****************************************
* 头文 件:#include <stdio.h>
* 功 能:释放malloc申请的空间
* 函 数:void free(void *ptr)
* 注意:一个malloc对应一个free函数。
* 新手:忘记free
* 老手:找不到合适free的时机
******************************************/
#include <stdio.h>
int main(int argc,char *argv[])
{
/*为*p申请一个整形空间*/
int *p = (int)malloc(sizeof(int));
*p = 3;
printf("*p = %d\n",*p);
/*用完后记得销毁*/
free(p);
return 0;
}
3)void *calloc(size_t nmemb, size_t size);
在内存的动态存储区分配nmenb个长度为size的连续空间,并初始化为0。
4)void *realloc(void *ptr, size_t size);
将ptr的内存,重新分配为size大小