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];