C/C++语言中的指针

这几天在接触一些C语言的项目,发现自己对C语言,包括C++的知识理解不透彻,尤其是指针。导致项目完全看不懂。因此这一篇就来补补C/C++中指针的知识。

参考书籍《C++ Primer》


指针

简单比喻

什么是指针,假如你住5楼503号房间。那么有一张纸条,纸条上写着5楼503。那么,我们就说这张纸条就是指向你房间的一个指针。

定义

指针(Pointer)是指向(Point to)另外一种类型的复合类型。

指针有两个特点:

  • 本身是一个对象,允许对指针进行赋值和拷贝,而且在指针的生命周期内可以先后指向几个不同的对象。
  • 无须在定义时赋初始值

一个简单例子

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>

int main() {
int ival = 42;
int *p = &ival;

printf("p是一个指针,P为%p\n",p);
printf("*p是指针指向的变量,*p为%d\n",*p);
return 0;
}

输出

1
2
p是一个指针,P为0x7ffe09031b1c
*p是指针指向的变量,*p为42

在这个例子中,我们用 int *p来定义指针,这时候p是一个指针。&ival的意思是取int型变量ival的地址。

而在输出的时候,*p是指针指向的变量,也就是说,*号在这里成了解引用符号。仅在指针确实指向了某个对象,即指针确实有效的情况下,*p才适用。

理解的关键:在定义阶段, 用int *p用来定义指针。在操作阶段,*p是解引用。

阅读更多

了解makefile

使用 gcc 命令可以很方便地在Linux下编译C源代码,但是,当我们的工程变大了之后,项目下面有很多 .c.h文件,各种依赖关系错综复杂。这时候,手工编译就不是那么划算了。makefile就是用于解决这个问题的。

阅读更多

gcc编译基本操作

假设我现在有3个文件,分别是:

  • mystrlen.c: 是我自己实现的一个计算字符串长度的算法函数。
  • mystrlen.h: 该算法的头文件。
  • test.c: main函数,里面有一些字符串需要调用上面的算法来计算长度

那么在 Linux 下,如何用 gcc 把 mystrlen.c 编译成动态链接库,方便 test.c 去使用呢 ?


阅读更多

浅谈 socket 编程

计算机通信和socket

计算机程序之间的通信,是进程与进程之间的通信。之前在 Linux 学习中就遇到用管道(PIPE)来让一个进程的输出和另一个进程的输入连接起来,从而利用文件操作API来管理进程间通信。

阅读更多