一、指针数组和数组指针的应用
先看下面这一段代码。
#include <stdio.h>
#include <stdlib.h>
int main()
{
char *str[] = { "Welcome", "to", "Fortemedia", "Nanjing" }; //第一行
char **p = str + 1; //第二行
str[0] = (*p++) + 2; //第三行
str[1] = *(p + 1); //第四行
str[2] = p[1] + 3; //第五行
str[3] = p[0] + (str[2] - str[1]); //第六行
printf("%s\n", str[0]);
printf("%s\n", str[1]);
printf("%s\n", str[2]);
printf("%s\n", str[3]);
return 0;
}
第一行定义了一个指针数组,每个元素都是一个指针。
第二行定义了一个二级指针,将p指向了to
第三行结束的时候,p指向了Fortemedia, 然后str[0]指向了Nanjiing的后面一个元素,所以这个时候*str[]就成了
*str[] = {"","to", "Fortemedia", "Nanjing"}
第四行执行的时候p的位置没有移动,p + 1指向的是Nanjing,然后赋值给str[1];这时就变成了
*str[] = {"", "Nanjing", "Fortemedia", "Nanjing"}
第五行的时候p[1]还是指向的Nanjing,p[1]+3就是指向了jing,并且赋值给了str[2],这时就变成了
*str[] = {"", "Nanjing", "jing", "Nanjing"}
到第六行的时候p[0]就是指向jing,str[2]和str[1]的地址相差的就是三,所以str[2]- str[1] = 3,然后p[0]加上3就指向了'g'。最后变成了
*str[] = {"", "Nanjing", "jing", "g"}
二、函数指针和指针函数的区别
指针函数是返回指针类型的函数
int *func();
这就是一个指针函数,它的返回值类型是一个int型的指针.
函数指针是一个指向函数的指针
int (*p)(int a);
p是一个指向一个拥有一个int类型的形参,返回类型是int型的指针。
三、什么是野指针
野指针就是指向“垃圾”内存的指针。
野指针形成的原因:
1、指针变量没有初始化
2、指针被free或者delete释放后没有将它置为NULL。
3、指针的操作超越了变量的范围。
【注意】:我们在写代码的时候一定要注意避免野指针的出现。
四、内存分配的几种方式
1、从静态存储区域分配。内存在程序编译的时候就已经分配好了,这块内存在程序的整个运行期间都存在,例如全局变量
2、在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。
3、从堆上分配(动态内存分配)。程序在运行的时候用malloc 或者 new 申请任意多少的内存,程序员自己负责在何时用free或者delete释放内存。动态内存的生存周期由程序员决定,使用很灵活。