14-数组与指针

&寻址运算符

*指针运算符

&寻址运算符与*指针运算符

具有相同的优先级,自右向左结合。

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

蓝色的加法就加一维数组的字节数 橙色的加法加数据类型的字节数

 

通过行地址去找到nm列的元素。

&a[n][m]   a[n]+m  (关键是要搞清楚 以一维数组老做判断 还是以整体的二维数组来进行判断 )

 

//nm列的元素

*(a[n]+m)

*(*(a+n)+m)   //a+n  a[n]  *(a+n)   a[n]+m

 

下节课:

字符串和指针(数组和指针)  指针类型的数组

函数和指针

指针总结

结构体

预处理

位运算

数据结构

写项目

 

 

 

猜你喜欢

转载自www.cnblogs.com/tiantiancode/p/11131766.html