指针一级指针
定义一个指针指向一个变量的地址
Type * p = &var;
int i;
int *p = &i;
// 通过*p读写i的值
*p = 10;
int a = *p;
指针的指针二级指针
用一个指针指向另一个指针
的地址, 不管几级指针都是指针.
Type ** q = &p
;
char *p = "abc";
char **q = &p;
// 读取二级指针的值
printf("%s \n", *q);
// 等价于
printf("%s \n", p);
常量指针const *
常量指针一但初始化(必须初始化)就不能再改变指针的指向
但可以修改所指向内存的内容
(前提是该内存可以被修改)。
const Type * p = &var;
Type const * p = &var;
int a = 100;
const int *p = &a;
// 等价于
int const *p = &a;
*p = 20; // ok
int b = 10;
p = &b; // error
指针常量* const
被指针常量修饰的指针不能通过该指针
修改所指向的内存,但可以修改指针的指向
。
Type * const p = &var;
int a = 10;
int * const p = &a;
*p = 12; // error
int b = 100;
p = &b; // ok
指针数组*p[n]
指针数组也是一个数组
,操作方式与数组相同。只不过每个元素为指针类型
。
Type *p[N]
char *p [] = {"abc", "123"};
// 读
int len = sizeof(p) / sizeof(p[0]);
for (int i=0; i<len; i++)
prinft("%s \n", p[i]);
// 写
for (int i=0; i<len; i++)
p[i] = "911";
数组指针Type (*p)[n]
数组指针也是一种指针,同样只占用4个字节,与普通指针没什么两样。
Type (*p)[10] = &typeArr;
int arr[10] = {1,2,3,4,5};
int (*p)[10] = arr; // 1
int (*p)[10] = &arr; // 2
int (*p)[10] = &(arr[0]); // 3
// 读
printf("%d \n", p[1]);
printf("%d \n", *(p+1));
// 写
*p[0] = 10;
二级指针模拟二维数组动态分配
char **p = NULL;
// 分配p的空间
const int n = 3;
*p = (char **)malloc(n * sizeof(char *));
// 为p中的每个元素分配空间
// 每个元素分配 50 byte
const int strSize = 50;
for (int i=0; i<n; i++)
p[i] = (char *)malloc(strSize * sizeof(char));
// 使用...
strcpy(p[1], "abcd");
// 释放空间
// 由内向外, 先释放低维(数组维度)空间
for (int i=0; i<n; i++) {
free(p[i]);
p[i] = NULL;
}
// 再释放高维空间
free(p);
p = NULL;