C 理解指针&;存储器地址

C 理解指针&;存储器地址,c,pointers,memory-address,C,Pointers,Memory Address,我正在上C编程入门课,很难理解它是如何工作的 谢谢你的帮助 使用*可以访问指针引用的对象。当指针引用变量a和b时,您对这些变量执行操作。我认为相同的变量名让你感到困惑 a = 10, b = 23 a = 23 b = 33 使用&可以为函数提供变量的地址,而不是值。 使用*可以访问地址的值 b=g(&b,&a)将变量b和a的地址提供给函数。 但是您可以使用*a访问b的地址,因为您这样声明函数:int g(int*a,int*b): *a指向b变量的地址 *b指向a变量的地址 我认为不同的

我正在上C编程入门课,很难理解它是如何工作的


谢谢你的帮助

使用
*
可以访问指针引用的对象。当指针引用变量a和b时,您对这些变量执行操作。我认为相同的变量名让你感到困惑

a = 10, b = 23
a = 23
b = 33

使用
&
可以为函数提供变量的地址,而不是值。 使用
*
可以访问地址的值

b=g(&b,&a)将变量
b
a
的地址提供给函数。 但是您可以使用
*a
访问
b
的地址,因为您这样声明函数:
int g(int*a,int*b)

  • *a
    指向
    b
    变量的地址
  • *b
    指向
    a
    变量的地址
我认为不同的变量名让您感到困惑

为了方便您自己,您可以将声明更改为
intg(int*b,int*a)
如果要更改它,请执行以下操作:

  • *b
    将指向
    b
    变量的地址
  • *a
    将指向
    a
    变量的地址

请记住,C按值传递所有函数参数-这意味着函数体中的形式参数是内存中与函数调用中的实际参数不同的对象,并且实际参数的值被复制到形式参数中

对于任何修改参数值的函数,必须传递指向该参数的指针:

int g(int *p1, int *p2)
{
    (*p1) = (*p1) + 3;
    (*p2) = 2*(*p1) - (*p2)+5;

    printf("*p1 = %d, *p2 = %d\n", *p1, *p2);

    return (*p1)+(*p2);
}
    int a = 2;
    int b = 7;
在上面的代码中,以下所有内容都是正确的:

void foo( T *ptr )  // for any type T
{
  *ptr = new_T_value(); // write a new value to the thing ptr points to
}

void bar( void )
{
  T var;
  foo( &var ); // write a new value to var
}
因此,当您向表达式
*ptr
写入新值时,与向
var
写入新值相同

我认为让您感到困惑的部分原因是,您的形式参数(
a
b
)和指针(
a
b
)的名称被翻转-
g:a
指向
main:b
),反之亦然

 ptr == &var
*ptr ==  var

对所述事件进行排序:

a
b
的声明和赋值:

int main()
{  

这里有一个技巧,传递给参数
int*a
的地址实际上是
b
,在第二个参数上也是如此:

int g(int *p1, int *p2)
{
    (*p1) = (*p1) + 3;
    (*p2) = 2*(*p1) - (*p2)+5;

    printf("*p1 = %d, *p2 = %d\n", *p1, *p2);

    return (*p1)+(*p2);
}
    int a = 2;
    int b = 7;

这里只打印
a
b
的值:

    b = g(&b , &a);

由于参数是指针,因此在此函数范围内对参数所指向的变量地址所做的更改是永久性的:

    printf("a = %d\n", a);
    printf("b = %d\n", b);

    return 0;
}

这里,取消对指针的引用(
*a
,在这些情况下不需要括号),意味着您现在正在使用存储在
a
所指地址中的值,因此
7+3=10
,现在存储在
a
所指地址中的值是
=10

int g(int *a, int *b) {

这里,同样的事情,去引用指针,所以
2*10-2+5=23
,存储在
b
所指地址中的值将是
23

    (*a) = (*a) + 3;

这里打印
a=10
b=23
,同样,取消引用指针意味着您正在使用存储在指针指向的地址中的值:

    (*b) = 2*(*a) - (*b)+5;

返回的值是
10+23=33
,因此对于
b=g(&b,&a)
b
将被分配
33
的值,
a
已经
23
,因此它保持不变:

    printf("a = %d, b = %d\n", *a, *b);
    return (*a)+(*b); 
}