C-传递结构指针与指向函数的整数指针

C-传递结构指针与指向函数的整数指针,c,pointers,data-structures,struct,linked-list,C,Pointers,Data Structures,Struct,Linked List,上述代码将使a的值变为999。但是为什么指向结构的指针不以同样的方式处理呢 void main(){ int a = 100; int* pa = &a; *pa = 999; } 为什么我们不能使用*head->data=6?为什么传递somethod(pa)是按引用传递,而somethod(head)是按值传递 为什么我们不能使用*head->data=6 因为->是一个解引用运算符,它替换星号*。你也可以用星号重写 struct node* head = (struct n

上述代码将使a的值变为999。但是为什么指向结构的指针不以同样的方式处理呢

void main(){
 int a = 100;
 int* pa = &a;
 *pa = 999;
}
为什么我们不能使用
*head->data=6
?为什么传递
somethod(pa)
是按引用传递,而
somethod(head)
是按值传递

为什么我们不能使用
*head->data=6

因为
->
是一个解引用运算符,它替换星号
*
。你也可以用星号重写

struct node* head = (struct node*) malloc(sizeof(struct node));
head -> data = 6;
head -> next = NULL;
你需要括号,因为。引入了运算符
->
,以便在指向
struct
s的指针的情况下使间接寻址更具可读性

为什么传递
somethod(pa)
是按引用传递,而
somethod(head)
是按值传递

它都是按值传递的,因为指针也是按值传递的。通过传递指针,可以引用原始变量并对其进行修改,但指针本身会被复制

为什么我们不能使用
*head->data=6

因为
->
是一个解引用运算符,它替换星号
*
。你也可以用星号重写

struct node* head = (struct node*) malloc(sizeof(struct node));
head -> data = 6;
head -> next = NULL;
你需要括号,因为。引入了运算符
->
,以便在指向
struct
s的指针的情况下使间接寻址更具可读性

为什么传递
somethod(pa)
是按引用传递,而
somethod(head)
是按值传递


它都是按值传递的,因为指针也是按值传递的。通过传递指针,您可以引用原始变量并修改它,但指针本身会被复制。

第一个问题的答案,您已经得到了。
对于第二个问题,考虑三个变量A、B、C,其中A& C是整数变量,B是整数指针。变量名及其值和地址(假定可以看到内存映射) 已在图片中显示。

请参阅此代码

(*head).data = 6
main()
中,a&c是具有不同数据的局部整数变量,b是整数指针。我们像这样调用函数
fun()

void fun(int *b,int *c)
{
    printf("\nfun %d",*b);
    b=c;
}
void fun1(int **b, int *c)
{
        printf("\nfun1 %d",**b);
    *b=c;
}
int main()
{
    int a=10;
    int c=200;
    int *b=&a;
    printf("\n %d %d %d",a,*b,c);
    fun(b,&c);
    printf("\n %d %d %d",a,*b,c);
    fun1(&b,&c);
    printf("\n %d %d %d",a,*b,c);

    return 0;
}
因为b是指针,所以我们传递b的值,即a(1000)的地址。 因此,如果我们修改b-inside函数
fun()
,该更改将仅反映在
fun()
中。
现在我们调用函数
fun1()

这里,我们传递的是b.i.e(3000)的地址。因此,当我们在
fun1()
中修改b时,我们也会在
main()
中看到反射

因此,通过值传递意味着,我们希望使用值,而不修改调用函数(
main()
)中的原始指针。但是,当我们需要在调用函数(
main()
)本身中反映的任何重大更改时,我们通过引用传递。

我希望,这澄清了疑问

第一个问题的答案,您已经得到了。
对于第二个问题,考虑三个变量A、B、C,其中A& C是整数变量,B是整数指针。变量名及其值和地址(假定可以看到内存映射) 已在图片中显示。

请参阅此代码

(*head).data = 6
main()
中,a&c是具有不同数据的局部整数变量,b是整数指针。我们像这样调用函数
fun()

void fun(int *b,int *c)
{
    printf("\nfun %d",*b);
    b=c;
}
void fun1(int **b, int *c)
{
        printf("\nfun1 %d",**b);
    *b=c;
}
int main()
{
    int a=10;
    int c=200;
    int *b=&a;
    printf("\n %d %d %d",a,*b,c);
    fun(b,&c);
    printf("\n %d %d %d",a,*b,c);
    fun1(&b,&c);
    printf("\n %d %d %d",a,*b,c);

    return 0;
}
因为b是指针,所以我们传递b的值,即a(1000)的地址。 因此,如果我们修改b-inside函数
fun()
,该更改将仅反映在
fun()
中。
现在我们调用函数
fun1()

这里,我们传递的是b.i.e(3000)的地址。因此,当我们在
fun1()
中修改b时,我们也会在
main()
中看到反射

因此,通过值传递意味着,我们希望使用值,而不修改调用函数(
main()
)中的原始指针。但是,当我们需要在调用函数(
main()
)本身中反映的任何重大更改时,我们通过引用传递。

我希望,这澄清了疑问

嗯。。。两者都是这里的传递指针(“引用”)。您可以更改它们指向的内容(int或struct),但使用双指针时,您无法更改它们指向的位置。所以你的第二个问题是荒谬的。您的第一个问题基本上误解了
->
的目的,即在单个运算符中取消引用和查找属性。你可以一直做
(*head)
如果您想查看用于取消引用的
*
。@ShadowRanger您的意思是——但是使用双指针,您可以更改它们的指向?@AjayBrahmakshatriya:Oops。很确定我想打字,但没有双指针。。。。同样的想法。嗯。。。两者都是这里的传递指针(“引用”)。您可以更改它们指向的内容(int或struct),但使用双指针时,您无法更改它们指向的位置。所以你的第二个问题是荒谬的。您的第一个问题基本上误解了
->
的目的,即在单个运算符中取消引用和查找属性。你可以一直做
(*head)
如果您想查看用于取消引用的
*
。@ShadowRanger您的意思是——但是使用双指针,您可以更改它们的指向?@AjayBrahmakshatriya:Oops。很确定我想打字,但没有双指针。。。。同样的想法。