&寻址运算符
*指针运算符
&寻址运算符与*指针运算符
具有相同的优先级,自右向左结合。
int a;
Int *p=&a;
*&a---->a
&*p---->p
int *p=&a;
指针的赋值:
声明的时候:赋值int *p=&a;
先声明再赋值:int a; int *p; p=&a;
*p单独出现的时候是数据。
int *p 前面带有数据类型。
一、一维数组和指针。
1、一维数组地址。
就是数组第一个元素的地址。
1 #include <stdio.h>
2
3 int main()
4 {
5 int arr[5];
6 printf("%d\n", &arr[0]);
7
8 return 0;
9 }
定义一个指针,把一维数组的首地址&a[0]赋予这个指针ptr,就说ptr指向数组a[5]。
一个数组的数组名就是这个数组的首地址。arr[5] &arr[0] == arr == ptr
2、对一维数组进行输入和输出。
A、指针不发生改变。
1 #include <stdio.h>
2
3 int main()
4 {
5 //int arr[5];
6
7 //for (int i = 0; i < 5; i++)
8 //{
9 // arr[i] = i + 1;
10 //}
11
12
13 //for (int i = 0; i < 5; i++)
14 //{
15 // printf("arr[%d]=%d\n", i, arr[i]);
16 //}
17
18
19 int arr[5];
20 int *p = arr; // int *p=&arr[0];
21
22 for (int i = 0; i < 5; i++) //i 0-4
23 {
24 //只要指针变量声明完之后 p就是地址 *p就是陪这个地址指向的变量。
25 *(p+i) = i + 1; //arr[0]--*p arr[1]--*(p+1) arr[2]--*(p+2)
26 }
27
28
29 for (int i = 0; i < 5; i++)
30 {
31 printf("arr[%d]=%d\n", i, *(p + i));
32 }
33 }
*只有在声明的是时候表示是指针,其他任何情况单独出现* 都表示指针运算符。
B、在对数组索引是,指针p发生改变,那么在打印之前必须把p重新指向数组的首地址。
1 int arr[5];
2 int *p = arr; // int *p=&arr[0];
3
4
5 /********************************
6 1: *p -- arr[0] 1
7 2: *(p+1) -- arr[1] 2
8 3: *((p+1)+1) -- arr[2] 3
9 ********************************/
10
11 printf("赋值之前:%d\n", p);
12
13 for (int i = 0; i < 5; i++) //i 0-4
14 {
15 *p++ = i + 1; //能不能把一到5复制到数组 p是在发生变化的
16 //在一个表达式里面 p++ 就是先计算表达式的值 在给p+1
17 // ++p 先给p+1 再计算表达式的值
18 }
19
20 printf("赋值之后:%d\n", p);
21
22 for (int i = 0; i < 5; i++)
23 {
24 printf("arr[%d]=%d\n", i, arr[i]);
25 }
26
27
28 p = &arr[0]; //把p重新指向数组的首地址
29 printf("打印之前:%d\n",p);
30
31
32 for (int i = 0; i < 5; i++)
33 {
34 printf("arr[%d]=%d\n", i, *p++);
35 }
36
37 printf("打印之后:%d\n", p);
建议:遇见指针:1、这个指针的指向类型? 2、这个指针指向哪里? 3、指针自己的类型?
二、二维数组和指针。
1、二维数组的地址。
首地址:
&a[0][0] a[0] &a[0] a &a
行地址:
1、第0行的地址就是首地址
2、第1行 &a[1][0] a[1] &a[1] a+1
3、第2行 &a[2][0] a[2] &a[2] a+2
4、第i行 &a[i][0] a[i] &a[i] a+i
蓝色的加法就加一维数组的字节数 橙色的加法加数据类型的字节数
通过行地址去找到n行m列的元素。
&a[n][m] a[n]+m (关键是要搞清楚 以一维数组老做判断 还是以整体的二维数组来进行判断 )
//n行m列的元素
*(a[n]+m)
*(*(a+n)+m) //a+n a[n] *(a+n) a[n]+m
下节课:
字符串和指针(数组和指针) 指针类型的数组
函数和指针
指针总结
结构体
预处理
位运算
数据结构
写项目