上周末,我在图书馆看到了这本很薄的书 -- 《深入理解 C 指针》
这本书中写的内容,个人感觉适合一个初学者,内容不是很难。我也读了下,对每一章都做了笔记,笔记都是用代码的形式贴出来。
Chapter1.h
#ifndef __CHAPTER_1_
#define __CHAPTER_1_
/*《深入理解C指针》学习笔记 -- 第一章*/
/*一个数如果是无符号的,那么尽量去选用 size_t 类型*/
/*使用 size_t 类型的时候一定要用对了输出格式*/
void __size_t_test();
//对指针进行加的操作就是指针原来指向的地址加上数据类型的大小乘以加的那个数
//对指针进行减的操作就是指针原来指向的地址减去数据类型的大小乘以减的那个数
void __pointer_add_sub_test();
/*指针用 const 修饰的各种表现*/
void __const_to_pointer();
#endif
Chapter1.cpp
#include "Chapter1.h"
#include <stdio.h>
/*一个数如果是无符号的,那么尽量去选用 size_t 类型*/
/*使用 size_t 类型的时候一定要用对了输出格式*/
void __size_t_test()
{
size_t test1 = -1;
printf("test1 : %d\n", test1);
printf("test1 : %u\n", test1);
size_t test2 = 1;
printf("test2 : %d\n", test2);
printf("test2 : %u\n", test2);
/*
输出结果如下:
test1 : -1
test1 : 4294967295
test2 : 1
test2 : 1
*/
}
//对指针进行加的操作就是指针原来指向的地址加上数据类型的大小乘以加的那个数
//对指针进行减的操作就是指针原来指向的地址减去数据类型的大小乘以减的那个数
void __pointer_add_sub_test()
{
int test1 = 1;
int* p_test1 = &test1;
char test2 = 'a';
char* p_test2 = &test2;
printf("p_test1 - 1 address is : %x\n", p_test1 - 1);
printf("p_test1 address is : %x\n", p_test1);
printf("p_test1 + 1 address is : %x\n", p_test1 + 1);
printf("\n");
printf("p_test2 - 1 address is : %x\n", p_test2 - 1);
printf("p_test2 address is : %x\n", p_test2);
printf("p_test2 + 1 address is : %x\n", p_test2 + 1);
/*
输出结果如下:
p_test1 - 1 address is : 2dfdb8
p_test1 address is : 2dfdbc
p_test1 + 1 address is : 2dfdc0
p_test2 - 1 address is : 2dfda6
p_test2 address is : 2dfda7
p_test2 + 1 address is : 2dfda8
*/
}
void __const_to_pointer()
{
/*指向常量的指针*/
/*这里的指向常量只是指针认为是指向常量的*/
int test1 = 1;
const int test2 = 2;
/*这两个操作都是可以的,但是不能解引用而修改它*/
const int* p_test1 = &test1;
const int* p_test2 = &test2;
test1 = 3; /*这个是可以的*/
// *p_test1 = 3; 但是这个不行
/*指向非常量的常量指针*/
int test3 = 3;
int* const p_test3 = &test3; /*指针只能指向非常量,因为可以用解引用修改变量的值*/
// p_test3 = &test1; 同时,指针的值不能被修改
// int* const p_test4 = &test2; 指针只能指向一个非常量,因为可以被修改
/*指向常量的常量指针*/
const int* const p_test4 = &test2; /*代表指针的指向和指针指向的值都不能被修改*/
}