前言
本菜鸡开始了学习C语言的旅途。用这个来记录一下上课所学到的一些东西。仅作为自己的一个学习笔记。里面的内容也只是我对学到的东西的一些理解,可能有很多错误,大佬们勿喷。如果发现我理解的有哪些错误,欢迎评论区指出,希望大佬们不吝赐教。
指针
1. 什么是指针
地址: 系统为了方便给每一个字节区分,对他们进行逐一编号,成为地址。
指针概念: 专门用来存放变量地址的变量,或称为指针变量。
2.定义指针
指向类型 *指针变量名 {=初始值};
示例:
int a=5;
int *p=&a; //如果定义的a是其他类型, 前面就修改成其他类型。比如a是char型就是char *p=&a;
就是先分配一块内存叫做p,然后把a的地址存在里面。
就像上面的图,定义了一个a,系统就会分配一块地址给a,然后这块空间的内容就是5,再定义一个指针,这个指针指针指向a,也就是系统分配了一块地址给p,然后这块空间的内容就是a的地址。
3. 两个与指针相关的操作符
&(取地址符):单目运算符
&对象名
取某个对象(变量、数组、函数…)的地址
示例:
int x;
scanf("%d", &x);
*(指向运算符) :单目运算符
*地址 就等于 取出地址对应的那个变量
int a=5;
int *p=&a;
printf("%d\n",*p); //p里面的内容是a的地址。*p就是取出a的地址对应的值,也就是5。
*p=10; //这里将a的地址对应的空间里面的值改成了10,也就是将a改成了10.
指针的尺寸:
指针的大小是指指针变量所占的内存空间的大小 。
指针的尺寸由系统的位数来决定,而并非他所指向的类型。(我的理解就是不管这个指针指向的数据是什么类型,指针里面存放的都是地址,所以指针的尺寸就是一个地址的大小。64位系统地址是8字节,那么指针的尺寸就是8字节)。
4. 野指针与空指针
概念: 指向一片未知区域的指针,称为野指针。
危害:
-
引用野指针,就相当于访问一个非法内存,一般会出现段错误(Segmentation fault (core dumped))
-
引用野指针的时候有可能会意外访问到系统的关键数据,导致系统崩溃,后果很严重。
如何产生:
-
定义是没有进行初始化。
-
所指向的内存已经被系统回收。
-
指针越界。
如何防止:
- 定义时及时初始化 / 让他指向空
int * p = NULL ; //初始化 p 指向空 NULL
-
已经被系统回收的指针绝不使用/ 在回收后及时让他指向空 null
-
确认指针的访问范围,不要越界访问。
空指针其实就是0地址,NULL 也是一个指向0地址的一个a指针。
如:
int *p = NULL; //p就是一个空指针
空指针也不能引用,不能修改里面的值。会出现段错误。
小练习:利用指针实现在被调函数中交换主调函数的变量的值
#include<stdio.h>
void swap(int *p1,int *p2)
{
int t=*p1;
*p1=*p2;
*p2=t;
}
int main()
{
int a=10,b=20;
swap(&a,&b);
printf("%d %d ",a,b);
return 0;
}
5.指针运算
指针的 加法/减法
加法: 加一意味着指针所指向的内存地址加一个单位(数据类型)
减法: 减一意味着指针所指向的内存地址减一个单位(数据类型 )
注意:
如果是整型就加4字节 , 如果是char 则加减1字节 。。。。
int a = 100 ;
int * p = &a ; // 定义一个指针P 并让他指向a的地址
int p1 = p + 1 ;
int p2 = p -1 ;
注意:
如果是整型就加4字节 , 如果是char 则加减1字节 。。。。
int a = 100 ;
int * p = &a ; // 定义一个指针P 并让他指向a的地址
int * p1 = p + 1 ;
int * p2 = p -1 ;