- 已关闭**。此问题需要超过focused。当前不接受答案。
- 想要改进此问题吗?**更新此问题,使其仅关注editing this post的一个问题。
昨天关门了。
Improve this question
我有这样一个练习:
给定一个字符指针,函数应该返回指针所指向的字符串的长度。
制约因素:
不要使用数组下标运算符("[]"),请使用Dreference运算符("*")。
不要使用数字计数器,使用指针算法.
使用assert验证指针是否不为NULL。
不知道如何接近它。不能使用strlen。我知道我错了,需要一些指导。
size_t StringLength(const char* str)
{
int length = *str;
assert (*str != 0);
return sizeof(length);
}
1条答案
按热度按时间mrwjdhj31#
你有一些误解,所以你的质询不获通过,但我仍会给予答复,因为我相信很多人都有这些误解,这会有所帮助:
如果你声明一个指针,你就在静态内存中声明了一个变量,它保存了一个内存块的地址,这个地址可以来自静态内存,也可以来自动态内存。
您通过
int *PTR;
执行此操作当然你可以使用任何数据类型,你的指针将持有地址块,它具有相应类型的大小。
现在有一件非常重要的事情要记住:当你声明一个指针时(它基本上只是说“这是一个指针”),或者当你在一个已经声明的指针上使用它时,“*-运算符”的意思是不同的。当你做第二个操作时,它会把数据返回给你,这些数据存储在地址中,这也是你的指针的值(正如已经说的,它只是一个变量)。
如果你想给这个变量赋值一个地址,你可以用不同的方法来完成,第一种方法是传递一个已经声明的变量的地址,你可以用&-操作符来完成。
这与以下情况不同:
在这里,您将var的地址作为PTR中的数据存储在内存块上,而您并不知道这一点。
第二种(也是最常用的)使用指针的方法是将指针指向其他指针,这就像声明两个变量,每个变量都有相同的值。
当你仔细想想的时候,它实际上和第一个用例没有什么不同,指针只是一种数据类型,就像其他类型(int char...)一样,它是“地址”类型。
使用指针的第三种情况,也是使用最多的:通过使用malloc(在extent calloc和realloc中)“创建”动态内存空间,并将新创建的空间的地址分配给变量。这不是巫术(!!)。与从静态内存分配地址的唯一区别是,您必须自己释放这些块。
这将创建3个int大小的存储块,并将PTR指向第一个块。
这些块在一个(逻辑)单元中,这意味着它们彼此落后。这意味着,你可以递增你的指针(递增地址),它将指向下一个块。
最后一点:您也可以在指针后面使用括号来访问指针地址处的数据,该地址按括号中的值递增。
这些是完全一样的。