C 根据K&;R
无法确定特定变量的地址(如C编译器所示)与实际底层硬件之间的依赖关系 考虑示例1,在使用C 根据K&;R,c,linux,pointers,gdb,memory-address,C,Linux,Pointers,Gdb,Memory Address,无法确定特定变量的地址(如C编译器所示)与实际底层硬件之间的依赖关系 考虑示例1,在使用cc t2.c编译此代码并执行它之后,它看起来没有按预期工作,px和py的地址不会因为任何原因而互换 例1: #include <stdio.h> void swap(int *,int *); int main(){ int x=3; int y=2; int *px; int *py; px=&x; py=&y; p
cc t2.c
编译此代码并执行它之后,它看起来没有按预期工作,px
和py
的地址不会因为任何原因而互换
例1:
#include <stdio.h>
void swap(int *,int *);
int main(){
int x=3;
int y=2;
int *px;
int *py;
px=&x;
py=&y;
printf("px = %x\npy = %x\n",&px,&py);
swap(px,py);
printf("After the swap\npx = %x\npy = %x\n",&px,&py);
}
void swap(int *px,int *py){
int temp;
temp=*px;
*px=*py;
*py=temp;
}
例2:
int x = 1, y = 2 ;int *ip; /* ip is a pointer to an int */
ip = &x; /* ip now points to x */
y = *ip; /* y is now 1 */
*ip = 10; /* x is now 10 */
*ip = *ip + 1; /* x is now 11 */
*ip += 1; /* x is now 12 */
++*ip; /* x is now 13 */
(*ip)++; /* x is now 14, parentheses are required */
例1问:
1) 我是否正确理解,从$5
开始,px
-与x
完全相同,只是它的值设置为十六进制的0x7efff5cc
,这只是内存中变量x
的地址
2) 如果我们使用int*ip
声明,是否意味着变量ip
的值等于int
的地址?那么,int
的十六进制地址是什么
3) 变量的地址是什么意思,这是什么?换言之:
- 我知道,CPU、ROM有RAM、L2、L3、L1缓存。那么,这个数字代表哪个特定内存的地址呢
- 有多少这样的
可以保存这些特定类型的内存?或者,在哪里可以在Linux系统上检查它0x7efff5cc
(int**)
符号是什么意思
5) 程序有什么问题,如何修复它,以便在将px
和py
的地址作为参数值传递给函数swap
后进行交换
例2问:
5) 关于表示法,我是否理解正确,只要我们通过int*ip
声明变量ip
是指向int
的指针,我们就不能分配,例如,十进制值给ip
,稍后使用类似于:ip=10的赋值
因为,在变量被声明为指针后,它仅用于保存其他变量的地址,而在十六进制中,ip
“指向的”是其他变量的地址
例1问:
1) 我的理解正确吗,从5美元开始,px-是
变量与x完全相同,只是其值设置为
十六进制格式的0x7efff5cc,它只是变量的地址
内存中的x
px是一个指针变量。这意味着px是一个包含地址的变量。您使用px=&x将其分配给x的地址,但您可以为其分配任何值
2) 如果我们使用int*ip声明,是否意味着变量ip
该值等于int的地址?那么,你的地址是什么
整数,十六进制
int*p是指向int的指针变量
3) 变量的地址是什么意思,这是什么
0x7efff5cc?换言之:
我知道,有RAM,L2,L3,L1缓存的CPU,ROM。所以,地址
这个数字代表哪个特定内存
0x7efff5cc是操作系统为程序中的数据空间提供的用于存储int x的数据
有多少这样的0x7efff5cc可以保存这些特定类型的内存
Linux可以有许多程序同时运行,这些程序具有相同的虚拟地址,但映射到不同的物理地址
或者,在哪里可以在Linux系统上检查它
有关如何在linux上查看虚拟地址的物理地址的信息,请参阅:
4) (int**)表示法是什么意思
变量是指向int的指针
5) 程序有什么问题,如何修复它,以便获得
px和py的地址在作为参数传递后交换
函数交换的值
已修复交换计划中的问题:
#include <stdio.h>
void swap( int **, int ** );
int main()
{
int x = 3;
int y = 2;
int *px;
int *py;
px = &x;
py = &y;
printf( "px = %x\npy = %x\n", px, py );
swap( &px, &py );
printf( "After the swap\npx = %x\npy = %x\n", px, py );
}
void swap( int **px, int **py )
{
int *temp;
temp = *px;
*px = *py;
*py = temp;
}
例1问:
1) 我的理解正确吗,从5美元开始,px-是
变量与x完全相同,只是其值设置为
十六进制格式的0x7efff5cc,它只是变量的地址
内存中的x
px是一个指针变量。这意味着px是一个包含地址的变量。您使用px=&x将其分配给x的地址,但您可以为其分配任何值
2) 如果我们使用int*ip声明,是否意味着变量ip
该值等于int的地址?那么,你的地址是什么
整数,十六进制
int*p是指向int的指针变量
3) 变量的地址是什么意思,这是什么
0x7efff5cc?换言之:
我知道,有RAM,L2,L3,L1缓存的CPU,ROM。所以,地址
这个数字代表哪个特定内存
0x7efff5cc是操作系统为程序中的数据空间提供的用于存储int x的数据
有多少这样的0x7efff5cc可以保存这些特定类型的内存
Linux可以有许多程序同时运行,这些程序具有相同的虚拟地址,但映射到不同的物理地址
或者,在哪里可以在Linux系统上检查它
有关如何在linux上查看虚拟地址的物理地址的信息,请参阅:
4) (int**)表示法是什么意思
变量是指向int的指针
5) 程序有什么问题,如何修复它,以便获得
px和py的地址在作为参数传递后交换
函数交换的值
已修复交换计划中的问题:
#include <stdio.h>
void swap( int **, int ** );
int main()
{
int x = 3;
int y = 2;
int *px;
int *py;
px = &x;
py = &y;
printf( "px = %x\npy = %x\n", px, py );
swap( &px, &py );
printf( "After the swap\npx = %x\npy = %x\n", px, py );
}
void swap( int **px, int **py )
{
int *temp;
temp = *px;
*px = *py;
*py = temp;
}
您的
swap
函数正在交换x
和y
的值,而不是px
和py
的值
由于px==&x
,这意味着*px==x
,因此py
也是如此
对于要将新值写入参数的函数,必须传递指向该参数的指针:
void foo( T *ptr )
{
*ptr = new_value(); // write a new value to the thing ptr points to
}
void bar( void )
{
T var; // for any non-array type T
foo( &var ); // write a new value to var
...
}
这适用于任何非数组类型<
int *ip;
ip = &x;
ip = &y;
ip++;
void foo( T *ptr )
{
*ptr = new_value(); // write a new value to the thing ptr points to
}
void bar( void )
{
T var; // for any non-array type T
foo( &var ); // write a new value to var
...
}
void foo( P **ptr )
{
*ptr = new_value(); // write a new value to the thing ptr points to
}
void bar( void )
{
P *var;
foo( &var ); // write a new value to var
...
}
void swap( int **ppx, int **ppy )
{
int *tmp = *ppx; // int * = int *
*ppx = *ppy; // int * = int *
*ppy = tmp; // int * = int *
}
px = &x;
py = &y;
swap( &px, &py );