《征服C指针》——读书笔记(1)

来源:互联网 发布:java public 编辑:程序博客网 时间:2024/06/13 08:50

一、指针的基本知识

示例代码:

#include <stdio.h>int main(void){    int hoge = 5;    int piyo = 10;    int *hoge_p;    /*输出每个变量的地址*/    printf("&hoge..%p\n", &hoge);    printf("&piyo..%p\n", &piyo);    printf("&hoge_p..%p\n", &hoge_p);    /*将hoge 的地址赋予hoge_p*/    hoge_p = &hoge;    printf("hoge_p..%p\n", hoge_p);    /*通过hoge_p 输出hoge 的内容*/    printf("*hoge_p..%d\n", *hoge_p);    /通过hoge_p 修改hoge 的内容*/    *hoge_p = 10;    printf("hoge..%d\n", hoge);    return 0;}

输出结果:
&hoge..0xbfbfd9e4&piyo..0xbfbfd9e0&hoge_p..0xbfbfd9dchoge_p..0xbfbfd9e4*hoge_p..5hoge..10

要 点:
1. 对变量使用&运算符, 可以取得该变量的地址。这个地址称为指向该变量的指针。
2. 指针变量 hoge_p 保存了指向其他变量的地址的情况下, 可以说“hoge_p 指向 hoge”。
3. 对指针变量运用*运算符, 就等同于它指向的变量。如果 hoge_p 指向 hoge, *hoge_p 就等同于 hoge。


一些要注意的点:

1. C语言混乱的声明 

    int* hoge_p, piyo_p; 确实符合“类型 变量名;”的格式,但是有问题:

    int* hoge_p, piyo_p; 等价于 int *hoge_p; int piyo_p;

2. 关于int main(void)

    不推荐 void main(void) 的写法,有返回值的main函数更优,返回0表示通知运行环境程序“正常结束”



二、指针和地址之间微妙的关系

指针就是地址?

/* ANSI C 为我们准备了“可以指向任何类型的指针类型”—— void*类型 */int hoge = 5;void *hoge_p;hoge_p = &hoge;                     /* 这里不报错 */printf("%d\n", *hoge_p);             /* 打印输出hoge_p 指向的变量的值 *//* 第7行会报错,如果仅仅告之内存地址,   却没有告之在那个地址上保存的数据类型,当然是不能取出值来的 */printf("%d\n", *(int*)hoge_p);       /* 将hoge_p强制转换成int* *//* 这里通过将“所指类型不明的指针”hoge_p强制转型成“指向int的指针”   来告之编译器类型信息,由此可以取出int类型的值。   但每次都这样写是比较繁琐的,不妨事先写成以下的声明:    int *hoge_p; */


三、指针运算

示例代码:

int main(void){int hoge;int *hoge_p;hoge_p = &hoge;printf("hoge_p..%p\n", hoge_p);hoge_p++;printf("hoge_p..%p\n", hoge_p);printf("hoge_p..%p\n", hoge_p + 3);return 0;}


输出结果:

hoge_p..0xbfbfd9e4    //  最初的值hoge_p..0xbfbfd9e8    //  加1 后的值 hoge_p..0xbfbfd9f4    //  加1 之后再加3 的值


指针运算的特征:

对指针进行加1运算,地址的值会增加当前指针所指向数据类型的长度

该例程中hoge_p是指向int的指针,而在作者的环境中int类型的长度为4,所以给地址加1,指针前进4个字节


要点:

对指针加 N,指针前进“当前指针指向的数据类型的长度×N”



0 0
原创粉丝点击