一-二 、字符串和字符指针上、下
指针:存储类型 数据类型 *变量名
字符指针:char *p
字符指针和字符串的特殊性在哪里?
把一个字符串赋给指针,指针存储了字符串常量的起始地址
这个“Hello World”是字符串常量,不能通过指针修改、
通过两个数组分别存储的字符串,之后操作第一个ch1数组中的字符串(这边叫操作不对),应该是通过if赋值改变的ch1数组中存储的字符串,改变过之后又赋给ch2数组。
v2
&p1=oxbfc6d748,是这个指针的地址,ox8048520是这个指针所储存的地址。
在c语言中,只有static修饰的局部变量,全局变量,字符串常量的情况下,放在静态区,程序结束才会释放,一旦运行之后,一直占据内存
就像这样,*p='h'或者像是这样* p1 -=32;就是已经赋值之后修改了指针
不利用字符串函数,实现两个字符串的连接
首先第一个循环, 判断字符不是\0 , 则i++ ,等到\0时,结束循环(找第一个\0)
第二个循环,结束条件是第二个\0
这个p=q是什么意思?
答:指针一直在++移动位置,要想回到字符串的首地址,要用之前备份下来的q的内容(字符串首地址
提示报错!!!
输出运行结果!!
三、指针数组(上)
1.指针数组的定义:具有相同存储类型和数据类型的指针变量构成的集合
-
指针数组名表示该指针数组的起始地址
-
声明一个指针数组
double * pa[2]
3.
a[0][1]=*(a[0]+1)
四、指针数组(下)
4.1
p[1]是一维数组首地址, p[1]+2 是首地址往后的两个地址,再取值,就是 *(p[1]+2)就是取到值7
4.2
首先三种形式输出二维数组所有元素(a[i][j]、*(*(a+i)+j)、*(*(p+i)+j))
-
如何计算指针数组占用的存储空间
一个指针数组里面有2个元素:一个指针占4个字节,看有几个指针n,总的存储空间就是4n
2.指针数组名加1,移动多少字节? 加1就是移动一个字节,一个字节就是一个指针,4个字节
-
指针数组名相当于什么样的指针? 二级指针
五、多级指针(上)
5.1多级指针的定义
指向指针变量的指针变量是多级指针
一级指针变量:指向处理数据的指针变量
二级指针变量:指向一级指针变量的指针变量
二级指针啥意思,就是一级指针p指向变量m的地址,二级指针q指向变量p的地址。指向指针的地址的指针叫二级指针。
二级指针q q就是一级指针再取地址,就是二级指针
这边我们来看一下 p指向m, p=&m,打印出来的是m的地址
q指向p,q=&q,打印出来的是p 的地址
但是m,*p,**q都是值,不是地址,都是变量m里面存的值
六、多级指针(下)
一个指针指着一个字符串,一一对应
思考:多级指针在内存中占几个字节?多级指针存的是地址,32位系统里都是4个字节,64位系统都是8个字节,跟几级指针没关系。
多级指针+1,移动多少字节?移动一个目标,就是一个指针,一个指针是4个字节
七、void指针和const修饰符(上)
和
两个都是类型转换,有什么区别呢?
第一个:给p赋值的时候,得对应p的类型 第二个:输出%d的时候得对应int类型
总的来说:所以给数据强制转换什么类型,根据使用场景确定
void没有进行强制转换之前不可以进行任何的算术运算!!
八、void指针和const修饰符(下)
两种实现方式:
1.利用数组实现
2.利用void 指针实现 a[i] 也可以写成 *((int *)p+i),这只是对
3.再利用一个int 型指针变量q,过渡一下
先是把a赋给q,q的指针类型是已知的,再把p转换成跟q一样的类型 很聪明的方法!!!!
const 修饰符
作用:是使一个变量常量化,不能修改,不能通过指针改变变量中的值
如果是const int *p,则p指向的变量中的值不能被修改,这边的const修饰的是*p,所以*p不可以被修改
但如果是int *const q,则是地址不能被修改,但是q指向的变量中的值可以被修改。就是q不再可以被赋值。const修饰的是指针q,因此这边地址不可以被修改。
所以说,const修饰谁,谁不可以被修改。
比如说这样就是不对的,已经用const修饰变量q了,那么再把m 的地址赋给q,就不对了,因为q的值不能被修改,也就是不能被赋值
那么只能改成这样
void指针有什么用?答:通过指针处理各种各样的情况
main是否可以带参数(涉及到const指针)?可以带参数,不过也没怎么听懂。
这边main函数中,带const是不能通过argv,去修改命令行传给它的那个参数