int *ptr; //指针类型是int*
char *ptr; //指针类型是char*
int **ptr; //指针类型是int**
int (*ptr)[3]; //指针类型是int(*)[3]
int *(*ptr)[4]; //指针类型是int*(*)[4]
2、为什么不能把局部变量的地址作为函数返回值返回?
答:当函数调用结束后,被调用函数的内存空间就会被释放,内存空间的使用权又会回到系统手中。虽然局部变量的地址被传回了主函数,但是由于这个地址所在的内存空间的使用权已经不在程序手中,所以此时取到的地址是一个不合法的地址,因此,不能把局部变量的地址作为函数返回值返回。
3、空指针如何使用?
(1)用空指针终止对递归数据结构的间接使用。
(2)用空指针进行函数调用失败时的返回值。
(3)用空指针作警戒值。
4、被调用函数形参的地址和实参的地址一样吗?
答:举例:
int a=12; int b=10;
judge(&a,&b); //调用函数judge ,实参是变量a和b的地址,假设,a的地址是0x1234,b的地址是0x4567,那么形参m ,n的 地址也会是0x123和0x456吗??
void judge(int* m,int* n) //定义了函数judge
在这里,只是把a和b的地址当成值传递给了m,n,所以这里0x1234和0x4567只是m和n的值,而m,n的地址就由系统随机分配,具体是什么,我们也不知道。
5、NULL总是被定义为0吗?
NULL不是定义为0,就是被定义为“(void *)0”,这两种值几乎是相同的。当程序中需要一个指针时(尽管编译程序并不是总能只是什么时候需要一个指针),一个纯粹的0或者一个void指针都能自动被转换成所需要的任何类型的指针。
6、假设char* a=“i am a girl'; 为什么拿到这个字符串的首地址就等于拿到了这个字符串??
答:因为在这里,内存空间是顺序排列的,当拿到第一个地址的时候,就可以顺序的往下找,对于字符串来说,只要找到结束符‘\0’的时候就等于拿到这个字符串。
7、假设int i=20; i的地址为0x1234;什么情况下i 和这个地址的联系会被斩断,下一个变量的地址还能被赋为0x1234吗?
答:当函数调用结束,活着程序执行完毕后,这个内存空间就会被释放,这时i和这个地址的联系就会被斩断,当声明了下一个变量时,系统又会为这个变量分配一个内存空间,但是不能确定这个变量是否一定能拿到0x1234这个地址,因为分配的内存空间是随机的,也就意味着这个空间的地址是不确定的。
8、右左法则是什么?
右左法则能让你准确理解所有的声明。从变量名开始阅读声明,向右看然后向左看。当碰到一个括号时就调转阅读的方向,括号内的所有内容都分析完毕就跳出括号的范围。这样继续,直到整个声明都被分析完毕。
9、.函数参数如何传递?
(1)值传递:把实参的值传递给形参。
(2)指针传递:指针传递时形参值的改变并不能改变实参的值,但形参所指向内容值的改变却能改变实参,这一点非常的重要,是指针传递的精华所在。
10、常用的字符串函数:
strlen(char *str); //获取字符串长度,字符串结束符NULL不计算在内 strcat(char *str,char *ptr); //将ptr接到str后面
strnact(char *str,char *ptr,2); //将ptr的前两个字符添加到str后
strcpy(char *str,char *ptr); //将ptr复制到str所指定的位置,包含NULL strncpy(char *str,char *ptr,nu); //将ptr的前nu个字符复制到str所指定的位置