基础Day0809(指针)
一个很显然的事实是,sizeof结果类型是size_t,它是无符号的,而%d用来输出int,是有符号的。
64位系统,这个位数指的是CPU 里面的通用寄存器的数据宽度为64位,也就是说一个地址占二进制位数是64,所以:sizeof(double *)==sizeof(int *)==sizeof(char *)64/88
32位系统,同理,它的一个地址占32位二进制空间,sizeof(double *)==sizeof(int *)==sizeof(char )32/84
其实明白了两个系统的寻址原理就能明白,大体就是这个原因。地址跟系统有关,但是基本数据类型占的大小是由C语言本身决定。
无论是什么类型的指针,存的都是地址,内存地址都是无符号整型的,无符号整型在64位操作系统中是8个字节的大小
p是指针变量,用来存放地址,你可以认为是上面所说的盒子的号码,“”是解引用操作符,你可以把它理解成打开盒子,*p就是打开p号盒子,取出里面的数据。p存放的是地址,*p是让程序去那个地址取出数据。(*取地值符)
int *p=&a; (p中存放的是a的地址)
p=&b;(p中存放的是b的地址)
p=200;(修改b的值为200)
野指针
对一个指向空地址的指针我们将其称为野指针,即所指向的地址不能进行操作的指针
空指针
万能指针
const修饰指针的三种效果:
当用const进行修饰时,根据const位置的不同有三种不同效果。 判断的标准是:const修饰谁,谁的内容就是不可变的。
1 、const int p = &a;
const修饰p, p不可变,p是指针,p是指针p指向的内存单元里的内容,p不可变也就是p指向的内存单元里的内容是不可变的。
PS: 这儿p是不可变的,但是p是可变的,就是p指向的内存单元或者说变量是可以变的,但是p指向谁,谁的值就不可变。
不可变指的是不能用p改变a的值,但是a自己或者别的指针还是可以修改a的值。
定义形参时,如果不想改变参数的值,可以用const修饰
2 、int const p = &a;
const修饰p,指针p是不可变的,也就是p指向的内存单元不可变。即p的指向不可变,p指向的内存单元的内容可以变。
3 、const int const p = &a;
*p和p都被const修饰了,所以p指向的内存单元,和p指向内存单元中存放的内容都是不可变的。
指针和数组
指针是一类特殊的变量,主要用途是函数间的传址,用这种方式来改变实参内容。而数组是用来实现线性表的结构,用于把同类对象集中在一起放置。
冒泡排序
实现strchr函数
字符串反转
指针数组
多级指针
指针和参数
值传递:实参的值传递给形参,不改变实参的值
地址传递:可以改变实参的值
指针作为函数返回值
strstr
指针
指针和字符串
实现strcat函数
字符串排序
数组(不能把所有的二级指针都当做二维数组来操作,可以把二维数组当做二维指针使用)