C和C++面试秘笈三——引用和指针(2)

一、指针数组和数组指针的应用

先看下面这一段代码。

#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释放内存。动态内存的生存周期由程序员决定,使用很灵活。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值