Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 根据K&;R_C_Linux_Pointers_Gdb_Memory Address - Fatal编程技术网

C 根据K&;R

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

无法确定特定变量的地址(如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;

    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缓存。那么,这个数字代表哪个特定内存的地址呢

  • 有多少这样的
    0x7efff5cc
    可以保存这些特定类型的内存?或者,在哪里可以在Linux系统上检查它

4)
(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 );