int i, *j; j = &i;这样就将变量 i 的地址放到了指针变量 j 中,通过 i 的地址,j 就能找到 i 中的数据,所以 j 就“指向”了变量 i。其中 & 是“取地址运算符”,与 scanf 中的 & 是一样的概念;* 为“指针运算符”,功能是取其内部所存变量地址所指向变量中的内容。因为 j 是定义成指针型变量,所以 j 中只能存放变量的地址,所以变量i前一定要加 &。需要注意的是,指针变量中只能存放地址,不要将一个整数或任何其他非地址类型的数据赋给一个指针变量。
# include <stdio.h>
int main(void)
{
int i = 3, *j; //*j表示定义了一个指针变量j
j = &i;
printf("*j = %d\n", *j); //此时*j完全等同于i
printf("j = %d\n", j); //j里面存储的是变量i的地址
return 0;
}
输出结果是:
# include <stdio.h>
int main(void)
{
int i = 3;
int *j = &i; //*j表示定义了一个指针变量j, 并将变量i的地址赋给它
printf("*j = %d\n", *j); //此时*j完全等同于i
printf("j = %d\n", j); //j里面存储的是变量i的地址
return 0;
}
输出结果是:
# include <stdio.h>
int main(void)
{
int *i, *j;
int k = 3;
i = &k;
j = i; //直接指针变量名之间进行赋值
printf("*j = %d\n", *j); //此时*j完全等同于k
printf("j = %d\n", j); // j里面存储的是变量k的地址
return 0;
}
输出结果是:
# include <stdio.h>
int main(void)
{
int k = 3;
int *i = &k;
int *j = i;
printf("*j = %d\n", *j); //此时*j完全等同于k
printf("j = %d\n", j); //j里面存储的是变量k的地址
return 0;
}
输出结果是:
# include <stdio.h>
int main(void)
{
int *p, *q;
printf("p = %#X\n", p);
printf("q = %#X\n", q);
return 0;
}
输出结果是:
# include <stdio.h>
int main(void)
{
int i = 3, *j;
*j = i;
return 0;
}
程序中,j 是 int* 型的指针变量。j 中存放的应该是内存空间的地址,然后“变量 i 赋给 *j”表示将变量i中的值放到该地址所指向的内存空间中。但是现在 j 中并没有存放一个地址,程序中并没有给它初始化,那么它指向的就是 0XCCCCCCCC 这个内存单元。这个内存单元是不允许访问的,即不允许往里面写数据。而把 i 赋给 *j 就是试图往这个内存空间中写数据,程序执行时就会出错。但这种错误在编译的时候并不会报错,只有在执行的时候才会出错,即传说中的“段错误”。所以,一定要确保指针变量在引用之前已经被初始化为指向有效的地址。
# include <stdio.h>
int main(void)
{
int *i;
scanf("%d", i);
return 0;
}
该程序试图给指针变量 i 所指向的内存单元赋值。但现在指针变量 i 并没有初始化,所以程序执行时出错。所以同样,在使用 scanf 时必须要先给指针变量 i 初始化。比如像下面这样写:
# include <stdio.h>
int main(void)
{
int *i, j;
i = &j; //先给指针变量i初始化
scanf("%d", i); //i本身就是地址, 所以不用加&
printf("%d\n", *i);
return 0;
}
输出结果是:
# include <stdio.h>
int main(void)
{
int i = 3;
int *j = NULL;
*j = i;
return 0;
}
之前是没有给指针变量j初始化,现在初始化了,但是将它初始化为指向 NULL。NULL 也是一个指针变量。NULL 指向的是内存中地址为 0 的内存空间。以 32 位操作系统为例,内存单元地址的范围为 0x00000000~0xffff ffff。其中 0x00000000 就是 NULL 所指向的内存单元的地址。但是在操作系统中,该内存单元是不可用的。凡是试图往该内存单元中写入数据的操作都会被视为非法操作,从而导致程序错误。同样,这种错误在编译的时候也不会报错,只有在执行的时候才会出错。这种错误也属于“段错误”。
版权说明:Copyright © 广州松河信息科技有限公司 2005-2025 版权所有 粤ICP备16019765号
广州松河信息科技有限公司 版权所有