指针经常遇到的问题

本文详细解析了C语言中的指针类型及其使用场景,包括空指针的应用、指针与局部变量的关系等,并介绍了字符串操作的基本函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、指针的类型:

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所指定的位置

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值