首页 » C/C++ » C指针

C指针

指针与数组

简单的指针数组运用:

int arr[2] = {1, 2};
int *p = arr;
printf("%d, %d\n", arr[0], arr[1]);
printf("%d, %d\n", p[0], p[1]);

数组指针

数组指针明确指定一个指向数组的指针:

int arr[2] = {1, 2};
int (*parr)[2] = &arr;
printf("%d, %d\n", arr[0], arr[1]);
printf("%d, %d\n", (*parr)[0], (*parr)[1]);
printf("%d, %d\n", *((*parr)+0), *((*parr)+1));

函数指针

函数指针声明一个指向函数的指针。函数指针通常用在函数参数中,作为回调出现,在C库快排函数、Pthread创建线程函数、Linux信号处理函数中出现的函数指针:

#include <stdlib.h>

void qsort(void *base, size_t nmemb, size_t size,
           int(*compar)(const void *, const void *));

#include <pthread.h>

int pthread_create(pthread_t *restrict thread,
       const pthread_attr_t *restrict attr,
       void *(*start_routine)(void*), void *restrict arg);

#include <signal.h>

typedef void (*sighandler_t)(int);

sighandler_t signal(int signum, sighandler_t handler);

引用与指针

C++的引用(reference)与指针很像,可视为一种受限的指针(相对而言不容易犯错)。引用相当于变量别名。

C++引用和指针的区别

指针可以不初始化,可以初始化为0/NULL,可以重新赋值;引用必须在声明时初始化,不能引用0/NULL,不能被重新赋值。

指针的使用非常灵活,有多种形式的指针存在(如本文前面所列),支持++/--/+n/-n等运算,引用则无法与其匹敌。

获取对象,需要对指针解引用(如*p),若指向对象,则访问对象成员用->(如p->mem)。引用的使用无需解引用,若引用对象,则访问对象成员用.(如ref.mem)。

在C++类设计中,我们通常让operator=返回一个对象本身的引用:

C& C::operator=(const C&) {
    // ...
    return *this;
}

分享

0