2010-01-23 67 views
2

这是一个非常简单的问题,但下面的函数原型是什么意思?了解C中的函数和指针

INT方(INT Y,为size_t * X)

什么剂量为size_t *是什么意思?我知道size_t是一个数据类型(int> = 0)。但是,我如何阅读附加的*?它是一个指向x的内存位置的指针吗?一般来说,我遇到了这个问题,如果有人可以提供一个方便的参考,我会很感激。


谢谢大家。我明白指针是什么,但我想我很难理解指针和函数之间的关系。当我看到定义为int sq(int x, int y)的函数原型时,那么我很清楚发生了什么事情。但是,当我看到类似int sq(int x, int* y)的东西时,我无法理解第二个参数的真正含义。在某种程度上,我明白它的意思是“传递一个指针”,但我不明白事情足以让我自己操纵它。

回答

2

* x表示x是指向size_t类型的内存位置的指针。

您可以使用x =&y设置位置; 或设置值为x指向:* x = 0;

如果您需要更多信息来看看:Pointers

10

如何在understanding pointers的教程?

但是,在这种情况下,指针可能用于修改/返回值。在C语言中,有其中一个函数可以返回一个值的两个基本机制(请原谅哑为例):

它可以直接返回值:

float square_root(float x) 
{ 
    if (x >= 0) 
     return sqrt(x); 
    return 0; 
} 

或者也可以通过返回一个指针:

int square_root(float x, float* result) 
{ 
    if (x >= 0) 
    { 
     *result = sqrt(result); 
     return 1; 
    } 
    return 0; 
} 

第一个被称为:

float a = square_root(12.0); 

...而后者:

float b; 
square_root(12.00, &b); 

注意,后者的例子还可以让你检查值是否恢复是真实的 - 这种机制被广泛应用于C库,其中一个函数的返回值通常表示成功(或缺乏它),而值本身通过参数返回。

因此与后者你可以写:

float sqresult; 
if (!square_root(myvar, &sqresult)) 
{ 
    // signal error 
} 
else 
{ 
    // value is good, continue using sqresult! 
} 
2

原型意味着该函数采用一个整数Arg和一个ARG这是一个指向为size_t类型。 size_t是一个在头文件中定义的类型,通常是一个无符号整数,但不仅仅使用“unsigned int * x”的原因是为编译器编写者提供了灵活性来使用别的东西。

指针是一个保存内存地址的值。如果我写

int x = 42;

然后编译器会在内存中分配4个字节,并在任何时候使用x来记住位置。如果我想明确地传递该位置,我可以创建一个指针并为其指定x的地址:

int * ptr =&x;

现在我可以通过周围的ptr到期望INT *为参数的函数,我可以通过取消引用使用PTR:

COUT < < *的ptr + 1;

将打印出来43. 有很多原因可能需要使用指针而不是值。 1)当你传递给一个函数时,你避免了复制构造的结构和类2)你可以有一个以上的变量句柄3)它是操纵堆上变量的唯一方法4)你可以使用它们来传递结果通过写入一个参数指向的位置而退出函数

+1

在附注上,我总是发现原因(4)是基于C语言的指针不幸(但有时不可避免)的用法。 – Kai 2010-01-24 00:38:25

+0

cout << * ptr + 1;是一个C++习惯用法,试试printf(“%d \ n”,* ptr + 1); – 2010-01-24 00:39:28

1

size_t *x表示您正在将指针传递给size_t“实例”。

有几个原因希望传递一个指针。

  1. 这样函数可以修改调用者的变量。 C使用按值传递,以便修改函数内的参数不会修改原始变量。
  2. 由于性能原因。如果一个参数是一个结构体,那么按值传递意味着你必须复制这个结构体。如果结构足够大,可能会导致性能下降。
0

鉴于这是一个函数的参数,还有一种解释。

当你在一个函数的参数中使用指针(something *),并且你传递一个变量的时候你没有传递一个值,你传递一个引用(一个“指针”)到一个值。对函数内部的变量所做的任何更改都会对其引用的变量(即函数外的变量)执行。

您仍然必须通过正确的类型 - 有两种方法可以做到这一点;在调用例程中使用指针或使用&(addressof)运算符。

我刚刚写了这个快速演示:

#include <stdio.h> 

void add(int one, int* two) 
{ 
    *two += one; 
} 

int main() 
{ 
    int x = 5; 
    int y = 7; 
    add(x,&y); 

    printf("%d %d\n", x, y); 

    return 0; 
} 

这是怎么会事就像scanf的工作。

+1

这仍然是传值,因为你传递了一个指向函数的副本,而不是引用。 – helpermethod 2010-01-24 00:35:40

+0

谢谢大家。我明白指针是什么,但我想我很难理解指针和函数之间的关系。当我看到一个定义为int sq(int x,int y)的函数原型时,我很清楚发生了什么事情。然而,当我看到类似int sq(int x,int * y)的东西时,我无法理解第二个参数的真正意义。在某种程度上,我明白它的意思是“传递一个指针”,但我不明白事情足以让我自己操纵它。 – Josh 2010-01-24 01:15:51

0
int square(int y, size_t* x);

声明一个功能有两个参数 - 一个整数,一个指向unsigned(可能大)整数,回报一个整数。

size_t是无符号整数类型(通常是typedefreturned by sizeof() operator

*(星形)信号指针类型(例如int* ptr;使得ptr是指向整数)在使用时,在声明所用(以及投射)时,或指针的取消引用lvalue or rvalue*ptr = 10;分配10到存储器指向通过ptr)。这只是我们的运气,相同的符号用于乘法(Pascal,例如,指针使用^)。

在函数声明的位置,参数的名称(这里的xy)并不重要。您可以在.c文件中用不同的参数名称定义您的功能。函数的调用者只关心函数参数的类型和数量以及返回类型。

当您定义函数时,参数现在名为本地变量,其值由调用者分配。传递对象by reference时或

指针功能参数被用作输出参数,你在一个指针传递给位置其中函数存储输出值。

C是美丽而简单的语言:)

2

在回答你的最后的评论,我会尽力解释。

你知道变量的值为,值为,变量的类型告诉你它可以容纳什么样的值。所以一个int类型的变量可以保存一个整数,它落在一定范围内。如果我宣布类似功能:

int sq(int x); 

...那么这意味着,sq功能需要你提供一个值,它是一个整数,它会返回一个值,也是一个整数。

如果一个变量是用指针类型声明的,这意味着该变量本身的值是“另一个变量的位置”。因此,一个int *类型变量可以保存为其值“另一个变量的位置,并且该变量具有int类型”。然后,我们可以扩展到功能:

int sqp(int * x); 

这意味着sqp函数需要你提供的值本身是一个int类型变量的位置。这意味着我可以把它像这样:

int p; 
int q; 

p = sqp(&q); 

&q只是意味着“给我位置q,而不是它的价值”)。在sqp,我可以用这个指针这样的:

int sqp(int * x) 
{ 
    *x = 10; 
    return 20; 
} 

*x意思是“在该位置的变量通过X特定行为,而不是X本身”)。

+0

有人正在解决你回答他的[问题](http://stackoverflow.com/q/24449072/2455888)有关这个答案:)。 – haccks 2014-06-27 10:10:51

0

ü说,你知道什么int sq(int x, int y) is.It意味着我们传递了两个变量x,y为aguements的功能sq.Say平方功能从main()功能称为在

main() 
{ 
    /*some code*/ 
    x=sr(a,b); 
    /*some other code*/ 
} 
int sq(int x,int y) 
{ 
    /*code*/ 
} 

任何操作完成在X,Y在平方功能不会影响值A,b 而在

main() 
{ 
    /*some code*/ 
    x=sq(a,&b); 
    /*some other code*/ 
} 
int sq(int x,int* y) 
{ 
    /*code*/ 
} 

Y上做将修改b的值,因为我们指到b

操作

所以,如果你想修改原始值,使用指针。 如果你想使用这些值,那么不需要使用指针。

0

上面的大部分解释都很好地解释了。我想添加这种参数传递的应用观点。当一个函数必须返回多个值时,它不能通过使用多个返回类型来完成(平凡,而且我们都知道)。为了实现将函数的传递指针作为参数来实现,提供一种方式来反映所做的内部被调用的函数的变化(如:开方)中调用函数(如:主)

如:愚蠢,但给你一个场景

//a function is used to get two random numbers into x,y in the main function 
int main() 
{  
int x,y;  
generate_rand(&x,&y);  
//now x,y contain random values generated by the function 
} 

void generate_rand(int *x,int *y) 
{ 
*x=rand()%100; 
*y=rand()%100; 
} 

2)经过时一个对象(一个类的对象或一个结构等)是一个代价高昂的过程(即如果这个尺寸太大,那么内存和其他约束等)

例如:不是将一个结构作为参数传递给一个函数,这个指针可能很方便,因为指针可以用于访问结构,但是也可以节省内存,因为您不会将结构存储在临时位置(或堆栈)

只是一对夫妇的例子..希望它有助于..

0

2年,仍然没有答案接受?好吧,我会尽量解释它...

让我们带你已经在你的问题中提到的两个功能:

int sq_A(int x, int y)

你知道这一点 - 这是一个叫sq_A函数,它接受两个int参数。简单。

int sq_B(int x, int* y)

这是一种称为sq_B函数,它接受两个参数:

  • 参数1是一个int

  • 参数2是一个指针。这是一个指向int

所以,当我们调用sq_B(),我们需要传递一个指针作为第二个参数 的指针。我们不能只传递任何指针 - 它必须是指向int类型的指针。

例如:

int sq_B(int x, int* y) { 
    /* do something with x and y and return a value */ 
} 

int main() { 
    int t = 6; 
    int u = 24; 
    int result; 

    result = sq_B(t, &u); 

    return 0; 
} 

main(),可变uint。要获得指向u的指针,我们 使用&运算符 - &u。这意味着“地址u”,并且是一个 指针。

因为uint&u是一个指向一个int(或int *),这是通过sq_B()参数2指定的类型。

有任何问题吗?