现在的位置: 首页 > 综合 > 正文

学点 C 语言(20): 数据类型 – 指针

2011年07月29日 ⁄ 综合 ⁄ 共 1772字 ⁄ 字号 评论关闭
1. 通过 &变量 可以获取变量地址:

#include <stdio.h>

int main(void)
{
    int num = 10;

    printf("变量值: %d\n", num);
    printf("变量址: %d\n", &num);

    getchar();
    return 0;
}

2. 表示变量地址的变量就是指针:


#include <stdio.h>

int main(void)
{
    int num = 10;
    int *p = &num;

    printf("%d, %p\n", num, p);
    
    getchar();
    return 0;
}

3. *指针 就如同变量本身是一样的:


#include <stdio.h>

int main(void)
{
    int num = 10;
    int *p = &num;

    printf("%d, %p, %d\n", num, p, *p);

    *p = 11;
    printf("%d, %p, %d\n", num, p, *p);

    (*p)++;
    printf("%d, %p, %d\n", num, p, *p);

    num = 99;
    printf("%d, %p, %d\n", num, p, *p);
    
    getchar();
    return 0;
}

4. 声明指针时要注意初始化, 没有初始化的指针是危险的:


#include <stdio.h>

int main(void)
{
    int n1 = 11;
    int n2 = 22;
    int *p = NULL; /* 初始化为空 */

    p = &n1;
    printf("%d, %p, %d\n", n1, p, *p);

    p = &n2;
    printf("%d, %p, %d\n", n2, p, *p);

    getchar();
    return 0;
}

5. 为什么没有初始化的指针是危险的:


#include <stdio.h>

int main(void)
{
    int *p;

    // 上面的指针 p 没有初始化话, 但它也有个垃圾地址
    printf("%p\n", p);

    // 此时如果给它赋值, 谁知道会覆盖了什么?
    //*p = 100;  /* 不要执行这个 */

    getchar();
    return 0;
}

6. 指向常量的指针: 不能通过指针修改它指向的值, 但该值可以通过其变量修改


#include <stdio.h>

int main(void)
{
    int n1 = 111;
    int n2 = 222;
    const int *p = &n1;  /* 注意 const 的使用 */

    printf("%d, %p, %d\n", n1, p, *p);

    n1 = 333;
    //*p = 333; /* 不可以这样, 因为现在的指针是常量 */
    printf("%d, %p, %d\n", n1, p, *p);

    p = &n2;    /* 可以改变指针的指向 */
    printf("%d, %p, %d\n", n2, p, *p);

    getchar();
    return 0;
}

7. 常量指针: 锁定指针的指向


#include <stdio.h>

int main(void)
{
    int n1 = 111;
    int n2 = 222;
    int *const p = &n1; /* 注意 const 的使用 */

    printf("%d, %p, %d\n", n1, p, *p);

    n1 = 333;
    //*p = 333; /* 不可以这样, 因为现在的指针是常量 */
    printf("%d, %p, %d\n", n1, p, *p);

//    p = &n2;    /* 现在不可以改变指针的指向了 */
//    printf("%d, %p, %d\n", n2, p, *p);

    getchar();
    return 0;
}

8. 指针是有类型的:


#include <stdio.h>

int main(void)
{
    long   n    = 100L;
    float  f    = 1.5f;
    double d    = 3.14159265;
    
    long   *p1   = &n;
    float  *p2   = &f;
    double *p3   = &d;

    printf("%ld\n", *p1);
    printf("%g\n",  *p2);
    printf("%.8f\n",*p3);

    getchar();
    return 0;
}

9. 令人迷惑的指针定义:


到底应该怎样写:
int *p;
int * p;
int* p;

因为 C 语言忽略空白, 这些都是对的, 但下面的例子会说明哪个更好:


#include <stdio.h>

int main(void)
{
    int n1, n2, *p; /* 定义了两个整数(n1、n2), 和一个整数指针(p) */

    n1 = 111;
    n2 = 222;

    p = &n1;
    printf("%d, %p\n", *p, p);

    p = &n2;
    printf("%d, %p\n", *p, p);
    
    getchar();
    return 0;
}

抱歉!评论已关闭.