C 理解指针&;存储器地址
我正在上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变量的地址 我认为不同的
谢谢你的帮助 使用
*
可以访问指针引用的对象。当指针引用变量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
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);
}