指针与引用

/***************************************************程序员面试宝典(第二版)*******************************************/

1.指针和引用的差别?
答:1)不能使用指向空值的引用,指针可以为空。
	2)指针可以被重新赋值
2. please check out which of the following statements are wrong?
int iv;//正确,声明了一个整型变量
int iv2 = 1024;//正确,声明一个整型变量,同时初始化这个变量
int &reiv;//错误,声明了一个引用,但引用不能为空,必须同时初始化
int &reiv2 = iv;//正确,声明了一个引用,同时初始化。
int *pi;//正确,声明了一个整数指针,没有定义这个指针指向的地址
*pi = 5;//错误,整数指针pi并没有指向实际的地址,在这种情况下就给它赋值
是错误的。
pi = &vi2;//正确,整数指针pi指向iv2实际的地址
const double di;//错误,const常量赋值时,必须同时初始化。
const double maxWage = 10.0;//正确,const常量赋值并同时初始化
3. 给内存地址"0x123456789"赋值为0,请写出代码
答:long *p;
	p = (long *)0x123456789;
	*p = 0;
	考查超界整数变量转化为长整型的问题
4. 传递动态内存
what will happen after running the "Test"?

void GetMemory(char *p, int num)
{
	p = (char *)malloc(sizeof(char) * num);
}

int main()
{
	char *str = NULL;
	GetMemory(str, 100);
	strcpy(str, "hello");
	return 0;
}
答:p申请了新的内存,只是把p所指的内存地址改变了,但是str丝毫未变,因为函数
GetMemory()没有返回值。str没有指向p所申请的内存

如果一定要用指针参数去申请内存,那么应该用指向指针的指针,传str的地址给函数
#include <stdio.h>

void GetMemory(char **p, int num)
{
	*p = (char *)malloc(sizeof(char) * num);
}

int main()
{
	char *str = NULL;
	GetMemory(&str, 100);
	strcpy(str, "hello");
	printf("%s\n", str);
	return 0;
}

也可以用函数返回值来传递动态内存
#include <stdio.h>

void *GetMemory(char *p, int num)
{
	p = (char *)malloc(sizeof(char) * num);
	return p;
}

int main()
{
	char *str = NULL;
	str = GetMemory(str, 100);
	strcpy(str, "hello");
	printf("%s\n", str);
	return 0;
}
5. 这个函数有什么问题,该怎么修改?
char *strA()
{
	char str[] = "hello world";
	return str;
}
答:char str[] = "hello world"是分配一个局部数组
char *str = "hello world"是分配一个全局数组
因为这个函数返回的是局部变量的地址,当你调用这个函数后,这个
局部变量str就释放了,所以返回的结构是不确定的且不安全,随时
都有被收回的可能。
修改为
const char* strA()
{
	char *str = "hello world";
	return str;
}
6.写出下面程序的运行结果
#include <stdio.h>
int main()
{
	int a[3];
	int *p, *q;
	a[0] = 0;
	a[1] = 2;
	a[2] = 3;

	p = a;
	q = &a[2];
	printf("a[q-p]=%d\n", a[q-p]);
	return 0;
}
答:指针与地址的关系
q的实际地址比p在2,a[q-p]就是a[2].
运行结果为2

7. what results after run the following code?
int *ptr;
ptr = (int *)0x8000;
*ptr = 0xaabb;
答:指针问题,这样做会导致运行时错误,因为这种做法给一个指针分配
一个随意的地址,非常危险。
8. 函数的形参在函数未调用时不分配存储空间
   函数需要在它被调用之前被声明,这个跟main()函数无关
   若一个函数没用return语句,则什么值都不返回
   
9. 写出函数指针,函数返回指针,const指针,指向const的指针,指向const的const指针
答:void (*f)();
	void *f();
	const int *;
	int *const;
	const int* const;
	
10. write in words the data type of the indetifier involved in the following definitions
答:1)float(**def)[10]
	def是一个二级指针,它指向的是一个一维数组的指针,数组元素都是float型
	2)double *(*gh)[10];
	gh是一个指针,它指向一个数组,数组元素都是double *
	3)double (*f[10])();
	f是一个数组,数组的元素是函数指针,指向的函数类型是没有参数且返回double的函数
	4)int *((*b)[10]);
	与int* (*b)[10]是一样的,b是一个指针,它指向一个数组,数组元素都是int *
	5)Long (*fun)(int);
	func是一个函数指针,指向的函数类型的参数是int且返回Long的函数
	6) int (*(*F)(int, int))(int);
	F是一个函数指针,指向的函数类型是有两个int参数并且返回一个函数指针的函数,返回的函数
	指针指向一个int参数且返回int的函数。
	
指针数组和数组指针
11.解释a输出的结果
	int (*a)[10];
	a++;
答:一个数组指针,指向一个含有10个int元素的数组,a++表明a指针向后移动40字节
12. 写出如下程序的输出
int a[[] = {1, 2, 3, 4, 5};
int *ptr = (int *)(&a + 1);
printf("%d %d", *(a + 1), *(ptr - 1));
答:2, 5
int *ptr = (int *)(&a + 1)
意思是指向a数组的第6个元素。整个数组的长度加1
13. 迷途指针
答:迷途指针也叫悬浮指针,是当对一个指针进行delete操作后(释放它所指向的内存)
并没有把它设置为空时产生的。
14. 空指针和迷途指针有什么区别?
答:迷途指针或空指针是非法的,而且可能造成程序崩溃,如果指针是空指针,尽管同
样是崩溃,但它同迷途指针造成的崩溃相比是一种可知的崩溃。
15. C++中有了malloc/free,为什么还需要new/delete
答:malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符,它们都可以
用于申请动态内存和释放内存


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值