定义指针变量:
类型名 *指针变量名
char *pa ; //定义一个指向字符型的指针变量
Int *pb ; //定义一个指向整型的指针变量
指针和指针变量
- 存放的值叫做指针
- 存放地址的变量叫做指针变量
取地址运算符和取值运算符
如果需要获取某个变量的地址,可以使用取地址运算符(&):
char *pa = &a;
int *pb = &f;
如果需要访问指针变量指向的数据,可以使用取值运算符(*):
prinrf(“%c, %d \n”, *pa, *pb);
指向数组的指针
char *p;
p = a; //语句1
p = &a[0]; //语句2
指向数组就是指向数组第一个元素的地址。语句1和语句2相等
避免使用未初始化的指针
指针的运算:
当指针指向数组元素的时候,我们可以对指针变量进行加减运算,这样做对意义相当于指向距离指针所在位置向前或向后第n个元素
对比标准型下标访问数组元素,这种使用指针进行间接访问的方法叫做指针法。
注:p+1并不是简单地将地址加1,而是指向数组的下一个元素。
指针与数组的区别
指针和数组名都指向一个地址
但是数组名只是一个地址,而指针是一个左值。(应该是可以进行解引用的???)
int *p1[5];指针数组
指针数组:指的是每个元素都是整型的指针变量
下标 | 0 | 1 | 2 | 3 | 4 |
---|---|---|---|---|---|
元素 | int * | int * | int * | int * | int * |
int (*p2)[5];数组指针
数组指针:是一个指针,指向的是一个数组
下标 | 0 | 1 | 2 | 3 | 4 |
---|---|---|---|---|---|
元素 | int | int | int | int | int |
指针与二维数组
int array[5][5];
*(array+1)表示第二行的首地址的值
*(array+1) == array[1]
((array+1)+3)表示第二行第四列的值
void指针
void指针通用指针,就是可以指向任意类型的数据。任何类型的指针都可以赋值给void指针。
NULL指针
不清楚要将指针初始化为什么地址时,请将它初始化为NULL。在对指针进行解引用时,先检查指针是否为NULL。
指向指针的指针
#include <stdio.h>
int main( )
{
int num =520;
int *p = #
int **pp = &p;
return 0;
}
指针数组和指向指针的指针
至少有两个好处:
1、避免重复分配内存
2、只需要进行一处修改
常量:
宏定义
#define
还可以使用const关键字修饰
指向常量的指针
#include <stdio.h>
int main()
{
int num = 520;
const int cnum = 880;
const int *pc = &cnum;
pc = #
printf(“pc: %d, pc: %p\n”, *pc, pc);
}
指向常量的指针(int * const p = #)
总结:
- 指针可以修改为指向不同的常量
- 可以通过解引用来读取指针指向的数据
- 不可以通过解引用修改指针指向的数据
常量指针 - 指向非常量的常量指针
-指针自身不可以被修改
-指针指向的值可以被修改 - 指向常量的常量指针(const int * const p = # )
-指针自身不可以被修改
-指针指向的值也不可以被修改
形参实参:
形参只是一个占位符,只在函数内部有效
传值和传址:
传值时在函数中修改,并不会影响main函数中的值
传地址修改,会影响main函数中的值
传数组:
并不是以数值的形式传到函数中,而是以地址的方式传到函数中。
可变参数
#include <stdarg.h>
-va_list
-va_start
-va_arg
_va_end
指针函数
int *p();
注:不要返回局部变量的指针
函数指针
#include <stdio.h>
int square(int);
int square(int num)
{
return num*num;
}
int main( )
{
int num;
int (*fp)(int);
printf(“请输入一个整数:”);
scanf(“%d”,&num);
fp = □
prinrf(“%d*%d=%d\n”,num,num,(*fp)(num))
return 0;
}