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

一、指针的基本知识

示例代码:

#include 

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..0xbfbfd9dc
hoge_p..0xbfbfd9e4
*hoge_p..5
hoge..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”



你可能感兴趣的:(C语言)