c语言中指针的用法

1.什么是指针:
指针就是地址。
2.指针变量的定义:
首先要区分指针与指针变量:指针是地址,而指针变量是用来存放这个地址的变量。
指针变量定义的一般形式:基本数据类型 + ’ * ’ + 变量名。
例如:int *i;
‘ * ’表示该变量的类型为指针类型。指针变量名为 i,而不是 *i,i的值为一个地址,*i的值是存放在地址i中的内容。
3.指针变量的初始化:
(1)int i = 3, *j; j = &i;
(2)int i = 3; int *j = &i; //*j表示定义了一个指针变量j, 并将变量i的地址赋给它
这个程序与第一个程序有什么不同?同样是将变量 i 的地址赋给指针变量 j,第一个程序是“j=&i;”,而第二个程序是“*j=&i;”。原因是,前者是定义指针变量后对它初始化,即先定义后初始化;而后者是定义指针变量时对它进行初始化,即定义时初始化。通过这个对比我们可以更鲜明地看出定义指针变量时的“*j”和程序中用到的“j”含义的不同。
常见未初始化的错误:
(1)# include <stdio.h> int main(void) { int i = 3, *j; *j = i; return 0; }
程序中,j 是 int
型的指针变量。j 中存放的应该是内存空间的地址,然后“变量 i 赋给 *j”表示将变量i中的值放到该地址所指向的内存空间中。但是现在 j 中并没有存放一个地址,程序中并没有给它初始化,那么它指向的就是 0XCCCCCCCC 这个内存单元。这个内存单元是不允许访问的,即不允许往里面写数据。而把 i 赋给 *j 就是试图往这个内存空间中写数据,程序执行时就会出错。但这种错误在编译的时候并不会报错,只有在执行的时候才会出错,即传说中的“段错误”。所以,一定要确保指针变量在引用之前已经被初始化为指向有效的地址。
(2)# include <stdio.h> int main(void) { int *i; scanf("%d", i); return 0; }
该程序试图给指针变量 i 所指向的内存单元赋值。但现在指针变量 i 并没有初始化,所以程序执行时出错。所以同样,在使用 scanf 时必须要先给指针变量 i 初始化。
(3)# 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 所指向的内存单元的地址。但是在操作系统中,该内存单元是不可用的。凡是试图往该内存单元中写入数据的操作都会被视为非法操作,从而导致程序错误。同样,这种错误在编译的时候也不会报错,只有在执行的时候才会出错。这种错误也属于“段错误”。
然而虽然这么写是错误的,但是将一个指针变量初始化为指向 NULL,这在实际编程中是经常使用的。就跟前面讲普通变量在定义时给它初始化为 0 一样,指针变量如果在定义时不知道指向哪里就将其初始化为指向 NULL。只是此时要注意的是,在该指针变量指向有效地址之前不要往该地址中写入数据。也就是说,该指针变量还要二次赋值。
既然不能往里面写数据,而且还容易犯错,为什么还要这样给它初始化呢?直接同前面定义普通变量时一样,在定义时也不初始化,等到后面知道该给它赋什么值时再给它赋值不行吗?可以!但还是建议大家将它初始化为 NULL,就同前面将普通变量在定义时初始化为 0 一样。这是很好的一种编程习惯。
最后关于 NULL 再补充一点,NULL 是定义在 stdio.h 头文件中的符号常量,它表示的值是 0。
4.指针与数组
(1)指针引用数组

int main(void)
{
    int a[] = {1, 2, 3, 4, 5};
    int *p = &a[0];
    int *q = a;
    printf("*p = %d, *q = %d\n", *p, *q);
    return 0;
}

上述程序中p与 q的值是相同的,这就表明p = &a[0]与q = a是等价的。
(2)不同指针类型的大小

int main(void)
{
    int    *a = NULL;
    float  *b = NULL;
    double *c = NULL;
    char   *d = NULL;
    printf("%d %d %d %d\n", sizeof(a), sizeof(b), sizeof(c), sizeof(d));
    return 0;
}
运行结果:4,4,4,4

可见,不管是什么基类型,系统给指针变量分配的内存空间都是 4 字节。在 C 语言中,只要是指针变量,在内存中所占的字节数都是 4。指针变量的“基类型”仅用来指定该指针变量可以指向的变量类型,并没有其他意思。不管基类型是什么类型的指针变量,它仍然是指针变量,所以仍然占 4 字节。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值