我刚刚开始使用 C 语言中的指针,而且花费的时间比预期的要长。我想打印一个指向整数内存区域的指针。
在主程序中,我有以下内容
int main(int argc, char* argv[]){
int tamano = 10, i = 0;
int *x = (int*) calloc(tamano, sizeof(int));
for(i = 0; i < tamano; i++){
x[i] = i+1;
}
imprimirPuntero(x);
return 0;
}
在程序中,我有以下内容
void imprimirPuntero(int *ptr){
int i = 0;
printf("Valores: ");
for(i = 0; i < 10; i++){
printf("%d ", ptr[i]);
}
}
所以我的问题真的是......我怎么知道指针有多少个位置,而不在过程中将那个大小传递给它?
在这些情况下,您只有 3 个实物期权,外加第 4 个红利:
正如您所指出的,您不能/想要使用此选项:
正常的做法是在最后一个元素之后立即传递一个指向元素的指针。但是,没有什么可以阻止您将指针传递给倒数第二个元素(除了使代码更复杂一些)。您的函数在 last之后立即传递位置,如下所示:
这是编译器对字符串自动执行的操作,使用 a
0
来标记它们的结束。好吧,相同,但适应了您使用的数据类型。而且,当然,编译器不会为您执行此操作,您必须手动将该值放在最后一个位置。奖金
当我们执行
malloc( )
,calloc( )
orrealloc( )
时,实现有其管理内存的方式。通常,就在返回给我们的地址之前,会放置一些控制数据,具体取决于实现;在 中libc
,该控制结构可以是一个简单的结构size_t
(取决于 的某些配置选项libc
)。您的函数,假设您的实现使用 asize_t
作为控件类型:最后一个选项不是 100% 可靠的;出于性能原因,库通常会分配比必要更多的 字节。但很高兴知道这种可能性存在:-)
你不知道,你的问题就像我不知道一个人的出生日期我怎么知道他们的年龄一样无法回答?.
如果你想知道指针指向的元素的数量,你要么事先知道它们(显式),要么当场推导出它们(隐式)。
要明确知道大小,您会遇到您已经知道的问题:您必须将大小与指针一起提供。
要隐式知道大小,您必须使用一些特殊代码标记元素的结尾(就像字符串对空字符所做的那样
\0
);假设在您的示例代码中,您的指针从不指向负值,我们可以使用(例如)-1
作为结束标记:您已经得到了一个相当完整且有充分理由的答案。
现实情况是,C 本身并不像在其他语言中那样建立向量的结尾,只是在字符串中,正如您之前被告知的那样。
例如,在 C# 中声明向量时,使用 Length 属性我们知道所述向量的大小。
在 C 中执行时:
在这两个选项中的任何一个中,在内存级别(示例)我们会看到如下内容:
是的,稍后将在函数中执行两个向量中的任何一个的遍历。
是的,没有建立如前所述的规则,例如从整数谱中选择一个值来指定它作为向量结束的指示符。向量的遍历将停止,直到遇到分段错误或一些类似的错误,因为在这种情况下,我们将首先遍历保留的内存位置,直到包含 567891 的位置,然后继续非保留的内存位置,在最好的情况是我们可以操纵但另一个进程也可以操纵它。
开始时,请在本地指定,因为可能有一些用于矢量操作的库或标准提供抽象层并允许完成所请求的操作。
问候。
就其本身而言,在函数执行期间无法计算数组的大小,但是,我们可以做的是将指针(指向数组的指针)包装在一个结构中,例如:
该成员
x
使我可以访问数组的内容,并且length
我们将在其中存储数组的大小。我们将在创建动态数组时执行此分配,我们可以通过函数执行此操作:第一个参数指向一个类型结构
ArrayInt
,第二个参数接收向量的大小。就是这样,每次我们想通过函数做一些操作时,它必须有一个接收结构基地址的参数,
ArrayInt
这样我们就可以访问数组的长度。例如,一个操作可能是打印数组的元素:
我们不需要第二个参数来存储数组的长度,我们只需要访问
length
结构的成员就ArrayInt
可以了。完整示例: