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