给定一个char指针,函数应该返回指针所指向的字符串的长度[closed]

lymnna71  于 2022-12-26  发布在  其他
关注(0)|答案(1)|浏览(114)
    • 已关闭**。此问题需要超过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);
    
}
mrwjdhj3

mrwjdhj31#

你有一些误解,所以你的质询不获通过,但我仍会给予答复,因为我相信很多人都有这些误解,这会有所帮助:
如果你声明一个指针,你就在静态内存中声明了一个变量,它保存了一个内存块的地址,这个地址可以来自静态内存,也可以来自动态内存。
您通过int *PTR;执行此操作
当然你可以使用任何数据类型,你的指针将持有地址块,它具有相应类型的大小。
现在有一件非常重要的事情要记住:当你声明一个指针时(它基本上只是说“这是一个指针”),或者当你在一个已经声明的指针上使用它时,“*-运算符”的意思是不同的。当你做第二个操作时,它会把数据返回给你,这些数据存储在地址中,这也是你的指针的值(正如已经说的,它只是一个变量)。
如果你想给这个变量赋值一个地址,你可以用不同的方法来完成,第一种方法是传递一个已经声明的变量的地址,你可以用&-操作符来完成。

int var = 4;
int *PTR = &var;

这与以下情况不同:

int var = 4;
int *PTR;
*PTR = &var;

在这里,您将var的地址作为PTR中的数据存储在内存块上,而您并不知道这一点。
第二种(也是最常用的)使用指针的方法是将指针指向其他指针,这就像声明两个变量,每个变量都有相同的值。

int *ptr1 = ..  //Adresse of something
int *ptr2 = ptr1; // same address

当你仔细想想的时候,它实际上和第一个用例没有什么不同,指针只是一种数据类型,就像其他类型(int char...)一样,它是“地址”类型。
使用指针的第三种情况,也是使用最多的:通过使用malloc(在extent calloc和realloc中)“创建”动态内存空间,并将新创建的空间的地址分配给变量。这不是巫术(!!)。与从静态内存分配地址的唯一区别是,您必须自己释放这些块。

int *PTR = malloc (3 * sizeof(int));

这将创建3个int大小的存储块,并将PTR指向第一个块。
这些块在一个(逻辑)单元中,这意味着它们彼此落后。这意味着,你可以递增你的指针(递增地址),它将指向下一个块。
最后一点:您也可以在指针后面使用括号来访问指针地址处的数据,该地址按括号中的值递增。

int *PTR = malloc(3 * sizeof(int));
*PTR = 4;

int *PTR = malloc(3*sizeof(int));
PTR[0] =4;

这些是完全一样的。

相关问题