关于指针的各类事项

指针

  1. “ & ” 取地址符
    后跟一个变量名时,&给出该变量的地址,&不能对没有地址的东西取地址。例如:&(a+b)就是错误的。

  2. 指针的本质就是保存地址的变量
    int i;
    int *p = &i;
    普通变量的值是实际的值。
    指针变量的值是具有实际值的变量的地址。
    指正做参数时可以通过指针访问更改其变量(地址传递)。

  3. “ * ” 操作符
    “ * ”是一个单目运算符,用来访问指针的值所表示的地址上变量,可以做右值也可以做左值。
    int k = *p;
    *p = k + 1;

  4. 指针声明
    指针声明变量是必须指定指针所指向变量的类型
    例如:int *prt;
    “ * ”说明声明的变量是指针类型,它指向的变量类型是int型

    多级指针的声明
    例如:int *p1,*p2,*p3; p1,p2,p3都是int指针类型
    int *p1,p2,p3; p1是int指针类型而p2,p3是int型
    指针指向类型对大小的影响:p++,ch++

  5. 指针初始化
    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);

  6. 指针对变量的操作
    1)访问
    2)更改

  7. 如何使用指针解决函数间的通信问题
    答:
    1)交换两个变量的值。
    2)函数返回运算的状态,结果通过指针返回。
    常用的套路是让函数返回特殊的不属于有效范围内的值来表示出错:-1或0。

  8. 指针的常见错误
    1)定义了指针变量,还没有指向任何变量,就开始使用指针或者指针使用完指向NULL以后,直接调用(野指针,造成段错误)
    2)不同指针类型直接赋值(viod * 除外)
    3)返回一个局部变量

  9. 一维数组与一级指针
    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;

  10. 指针常量与常量指针
    看const修饰在*前还是后。
    1)const在前是常量指针,也可以叫常指针。
    注意:不能通过这个张子贞去修改变量,但可以更改指针指向。
    例如:int i,j; consst int *p = &i; p = &j;
    2)const在后是指针常量
    能通过这个指针去修改那个变量,但是不可以更改指针的指向(数组是指针常量)
    例如:int i; int *const q = &i; *q = 26;

  11. 常量指针常量
    1)双重制度,指针不可改变,指向的目标数据对象也不可改变。
    例如:int n = 10,m = 30; const int *const p = &n;只能读,不能其他操作
    2)用const修饰的数组是常量指针常量
    例如:const int num[128] = {1};

  12. 内存的动态申请
    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大小

posted @ 2022-08-29 23:57  王廷胡_白嫖帝  阅读(2)  评论(0编辑  收藏  举报  来源