街角_祝福

导航

指针与引用

1.指针和引用的区别?

  1) 引用一定不为空,而指针可以为空。

   2)由于引用一定不为空,所以不需要做合法性检查,而指针去总要做合法性检查。

   3)引用有指针常量的性质,即引用不能修改其其引用的对象。

2.问题2

   书上讲这样的语句是错误的。

int *ptr;
*ptr = 7;

但是实际上我编译时并没有报错,TC和GCC编译都通过。


3.指针问题

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void GetMem( char *p, int num )//错误 
{
	p = (char *)malloc( sizeof(char)*num );
} 
char* GetMem2( char *p, int num )
{
	p = (char *)malloc( sizeof(char)*num );
	return p;
} 
int main(int argc, char *argv[])
{
	char *str=NULL, *str1=NULL;
	
	GetMem( str, 40 );
	str1 = GetMem2( str1, 40 );
	strcpy( str, "hello" );
	strcpy( str1, "hello" ); 
	printf( "%s\t%s", str, str1 ); 
	return 0;
}

GetMem函数执行时,参数p指向str,但是之后p又指向一块新分配的内存,而str并未改变,所以内存分配失败。

而GetMem2函数执行时,由于其有返回新分配内存的地址,所以给str1分配内存成功,所以可以向其复制字符串,而str复制字符串则程序将会崩溃。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* GetHello()//错误 
{
	char str[] = "hello,world!"; 
	return str;
} 
const char* GetHello2()//错误
{
	char str[] = "hello,world!"; //局部数组对应内存中的栈 
	return str;
}
const char* GetHello3()//正确 
{
	char *str = "hello,world!"; //全局数组,对应于全局内存 
	return str;
} 
const char* GetHello4()//正确 
{
	static char str[] = "hello,world!"; //全局数组,对应于全局内存 
	return str;
}
int main(int argc, char *argv[])
{
	char *str=NULL, *str1=NULL;
	
	str = GetHello();
	str1 = GetHello3();
	printf( "%s\t%s\n", str, str1 ); 
	return 0;
}

该例子中只有GetHello3,GetHello4是正确的,其他是错误的,虽然有的也会有正常结果。


4.指针运算

#include <stdio.h>
int main(int argc, char *argv[])
{
	int a[5];
	printf( "%d", &a[4]-a );
	return 0;
}

上面的运行结果是4,指针想减的结果是指针值/指针大小,即如果有:

#include <stdio.h>
int main(int argc, char *argv[])
{
	int *p, *q;
	int a=2, b=3;
	p = &a;
	q = &b;
	printf( "p=%d\tq=%d\tp-q=%d\tq-p=%d\n", p, q, p-q, q-p );
	return 0;
}

我的运行结果是:p=2359100       q=2359096       p-q=1   q-p=-1

#include <stdio.h>
int main(int argc, char *argv[])
{
	int *p, *q;
	p = (int *)0x8000;
	*p = 90;
	printf( "p=%d\t*p=%d\n", p, *p);
	return 0;
}

上述例子也是错误的,因为不允许给指针指定一个指定的地址。


5.各种指针

   函数指针: 

int (*func)( int );

   函数返回指针:

 int * func( void );

   指针常量:

 const int *

   常量指针:

 int * const 
数组指针:

int *ptr[10];
//或者
int *(ptr[10]);
数组指针:

int (*ptr)[10];



posted on 2012-06-19 22:17  街角_祝福  阅读(147)  评论(0)    收藏  举报