- 指针与变量
- 指针与一维数组
- 指针与二维数组
1、指针与变量
1.1、指针的概念与定义
- 指针即地址;
- 变量的指针即变量的地址;
- 定义指针的形式一般为:
- 基本类型 *指针变量名;
- 例如:int *p;
- 指针说明符:说明后面的变量是指针变量
1.2、指针的赋值(赋地址)
- 1、通过 取地址运算符 赋值
#include <stdio.h>
int main()
{
int a,*p;
p = &a;
return 0;
}
- 2、通过另一个指针
#include <stdio.h>
int main()
{
int a,*p,*q;
p = &a;
q = p;
return 0;
}
#include <stdio.h>
int main ()
{
int var_runoob = 10;
/**
指针即地址;
变量的指针即变量的地址;
*/
int *p; // 定义指针变量
p = &var_runoob;
printf("var_runoob 变量的地址: %p\n", p);
//var_runoob 变量的地址: 0x7ffeeaae08d8
k = &n;
*k = n;
return 0;
}
1.3、空指针的定义:
#include <stdio.h>
int main()
{
int *p = NULL; // int *p = 0;
/*
说明:
NULL表示空,其值为 0
空指针定义不能引用
*/
int *q;
q = p;
return 0;
}
1.4、指针的操作
“&”:取 地址 运算符
“*”:取内容运算符。
int *p; 定义时 * 为指针说明符。
#include <stdio.h>
int main()
{
int a = 3,b,*p;
p = &a;
b = *p + a;
printf("%d,%d\n",a,b);
return 0;
}
1.5、二重指针
用于存储指针的地址
*p:针对指针变量
#include <stdio.h>
int main()
{
int *p = &a;
int **p; //存储的指针p的地址
int **p = &p;
return 0;
}
2、指针与一维数组
2.1、一维数据的地址
2.2、一维数组的表达式
- a <====> &a[0]
- a + i <====> &a[i]
- *(a+i) <==⇒ a[i]
2.3、指向一维数组的指针
#include <stdio.h>
int main()
{
int a[] = {12,13,14,2,50,6,7},*p,*q;
p = a; // 相当于 p = &a[0]
q = p + 1; // 相当于 q = &a[i];
return 0;
*p = 12; //这里 *p 的作用是取指针变量 p 的内容
*(p + 2) = a[2]; //相当于取值操作,取 a[2] 的值
q[2] = 2; // 指针指向那个元素,那个元素就是首元素
}
2.4、指针的自增自减
指针自增:---------》 后移
指针自减:---------》左移
#include <stdio.h>
int main()
{
int a[] = {5,10,15,20,25},*p = a;
*++p; // 指针右移,10
*--p; // 指针左移,5
++*p; // 11
*p++; // 11
*p; // 15
// 靠近结合
a++; // 不合法,
a+1; // 相当于 &a[1]; 合法
/*
数组名是地址常量,不可进行自增自减运算
指针是变量,可以进行自增自减运算。
*/
return 0;
}
2.5、指针比较大小
指针比较大小就是所在 位置比较大小
指针相减就是位置相减
指针 不可相减
#include <stdio.h>
int main()
{
int a[10],*p = a, *q = a + 3; // *p = &a[0]; *q = &a[3];
p > q; // 0 ,0 > 3
p < q; // 1 ,0 < 3
q - p; // 3 , 3 - 0
q + p; // 指针不可相加
return 0;
}
2.6、函数之间对一维数组的引用
3、指针与二维数组
3.1、二维数组的指针
3.2、二维数组地址和内容的引用方式
*(a+1) + 2:第一行 第二列 的 地址;
((a+2)+3):第二行 第三列 的内容;
a[1] + 2:第一行 第二列的 地址;
*(a[2] + 3):第二行 第三列的 内容
*,[] 出现任意一个代表地址;
出现任意 两个代表 内容;
3.2.1、一维数组 a 中某元素引用的两种方式
①:a[i] ②:*(a+i)
3.2.2、二维数组 a 中某元素引用的四种方式
①:a[i][j]
②:((a+i)+j)
③:(a[i]+j)
④:((a+i))[j]
3.3、数组指针
int (*p)[4]; // p 为 int 类型 数组的指针
3.4、指针的数组
int *q[3]; //优先级 () > [] > * 指针数组
q[0]、q[1]、q[2] 均为 int *;
3.5、函数指针
int (*p)(); // 函数指针
3.6、指针函数
int *p(); // 指针函数
函数类型可以是任意型,所以返回值也可以是任意类型。