指针式C语言中的重要概念,也是C语言的一个重要特色,C的精华所在吧。
1.指针-内存地址;
2.指针变量:定义为,存放 指向存储什么数据类型的 地址 的变量;它的值就是地址;
定义指针变量:
类型名 *指针变量名;//类型名就是指向地址上的数据 的 类型;
例如:
char *pa;
int *pb;
(注意的是):避免访问未初始化的指针;
3. 取地址运算符:& 获取某个变量的地址;//初始化指针;
例如:(char a ;int b);
char *pc = &a;
pb = &b;
4. 取值运算符:* 访问指针变量指向的数据;
例如:
printf("%c,%d\n",*pa,*pb);
(注意的是):
取值运算符和定义指针一样都是使用星号(*);
直接访问:通过变量名来访问;
间接访问:通过指针变量访问;
5.指针和数组:数组名存储的是数组的第一个元素的地址(数组名就是个指针);
定义指向数组第一个元素的指针:
char *p,ar[10];
p = ar 等价于:p = &ar[0]//a[0]就是第一个元素的值;&取址,取存储这个数据的地址; //p存放是数组第一个元素的地址
指针运算: p-1 , p+1 //不是地址加一,加上一个sizeof(char),指向数组的 下一个元素
用指针定义字符串:
char *p = "duidui!";
指针和数组的区别:
数组名只是个地址,而指针是个左值;
6. 指针数组:一个数组,每个数组元素存放一个指针变量;//存储若干个指向指定的数据类型的地址(指针
int *pl[5] = {&a,&b,&c,&d,&e};
用于指向字符指针:
char *pl[3] = {
"让编程改变世界",
"Just do it",
"One more thing..."
};
数组指针: 指向一个数组地址的指针 //指向指针的指针; temp里存的是第一个元素的地址,p2存放的是temp的地址;
int (*p2)[5],temp[5] = {1,2,3,4,5};
p2 = &temp; //之前那个是 p = temp;
二维数组:int array[4][5]
array表示指向包含5个元素的 数组 的 指针, array 是个指针 指向地址的指针 ,这个地址 的存放数据类型是 五个元素的数组;
*array = array[0] 是 array[0][0](这是个值)的地址 ;//是什么 ,第一个数组的第一个元素的地址
*(array+1) = array[1]
*(array)+1 = &array[0][1];
*(*(array)+1) = array[0][1];
即:
*(array+i) == array[i];
*(*(array+i)+i) == array[i][j];
*(*(*(array+i)+j)+k) == array[i][i][k];
7. void: 通用型指针,任何类型指针都能赋给void//不必要不要用;
一旦指定了,就要用强制类型转换;
例如:
void *pv;
int *pq;
char *pw;
pv = pq;
(char *)pv = pw;
8. NULL: 空指针,不指向任何类型,对NULL解引用是非法的,而野指针不行;//节约了大量的调试时间
9.指向指针的指针:
int num = 520;
int *p =#//对p解引用(*p)得到一个整型的值
int **pp = &p;
printf("num: %d",num);
printf("*p: %d\n",*p);
printf("**pp: %d",**pp);
10.指针数组 和 指向指针的指针
通过指向指针的指针来指向数组指针可 显著提高代码的灵活性和安全性
避免重复分配内存,
方便修改
char *books[] = {
"《AAA》"
"《BBB》"
"<12321>"
"asdsad"};
char **daxie[2];
char **num;
num = &books[3];
daxie[0] = &books[0];
daxie[1] = &bokks[1];
11. 可以用数组指针指向二维数组
int array[3][4]={
{0,1,2,3},
{4,5,6,7},
{8,9,10,11}};
int (*p)[4];
p = array;
int i,j;
for (i = 0; i < 3; i++)
{
for(j = 0; j <4; j++)
{
printf("%2d", *(*(p+i)+j));
}
}
12.指向常量的指针:
常量:
520,'a',3.14;
#define LVE 520
#define A 'a'
#define PI 3.14
const int lve = 520;
const int fovr = 1314;
const char a = 'a';
const float pi = 3.14;//再const关键字的修饰下,变量就失去了可修改的特性,也就是变成了“只读”
const int *pc = &lve; //同样不可修改指向常量的值;
pc = &fovr;//但可以修改它的指向;
13.指向非 常量的 常量指针;让指针指向不可变
int num = 520;
int *const p = #
14.指向常量的 常量指针:都不能变了
const int *const p = &lve;
15. 指向 "指向常量的 常量指针" 的指针://换汤不换药
const int *const *pp = &p;