写一个指针类型的函数,返回一个指针,但是:
这个之前有解释过:
所以,在函数调用时候,返回值,是没有问题的;因为在函数中返回值的地址空间在被释放之前,值就已经赋值给了函数名,而返回地址时候,这块地址空间已经被释放了(个人理解,未必正确)。
要想返回地址没有问题:
1、设置全局变量——不建议
2、设置静态变量——视情况而定()
对比看一下:
返回值:
返回地址(返回值是函数指针):
局部变量,不能返回地址再取值:
要修改存储类型,使其在函数调用之后,内存不被释放:
附:字符串连拷贝——将通同样的数据内容,从一个地址空间,拷贝到另一个地址空间
函数原型 char *strcpy(char *dest, const char *src);
函数指针练习:模仿strcat函数,实现自己的字符串连接
注意:自增运算符的优先级>取值优先级,所以*str++ ==> *(str++)
与 i++一样,只不过一个是变量i,一个是指针变量*p;其实都是先用,再加:
i++ 是先用i的值,再将i的值++
*p++ 是先用*p的值,再将p的地址++
拆开来写就是:
*str
str++
因此:*str1++ = *str2++; 其实就是 *(str1++) *(str2++);
要理清楚的 :*(str1++) *(str2++);可不是str2地址递增,str2地址递增,然后取str2递增后的值,赋值给str1地址递增后的位置。而是与 a++ = i++一样
先各自取值,再赋值,然后再地址递增:
*str1 =*str2;
str2++;
srt1++;
------------------------------------------------------------------------------------------------------------------
练习2:模仿字符串转整形函数:atoi。
写一个自己的整形转字符串:inttostr
思路:
1、先用循环对整数取余,并移除掉最低位
2、字符’0‘与整数0,相差48,也就是’0‘
3、将筛选出来的每一位,存到数组里(这时候是反的,最低位跑到了最左边)
4、交换
(由于aa[i],在转换完成后,人为补了一个’\0‘,所以i--,走到最后一个字符aa[i],再找一个变量n从数组aa[0]开始交换,并往中间走。)
于是:
倒数第一个字符与第一个字符交换
倒数第二个字符与第二个字符交换
........随着i--;j++;若i=j,则数据为奇数个;若i<j,则说明数据为偶数个
如果是奇数个,i=j时候,最中间的字符不用动;偶数个时候,当i<j时候,最中间的两个数据已经被交换。
还有一个问题:上面代码中,函数中定义了一个静态数组,大小是固定的;那么,如果参数传递一个数组进来,是不是更好?