C 语言学习记录-代码篇-11

指针与数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#define N 5
int main()
{
//总结
//& 取地址
//* 根据地址取值
//指针不可以赋常量值
//一维数组里:score[i] => *(score[i] + i) => *(score + i)
//二维数组里:score[i][j] => *(score[i] + j) => *(*(score + i) + j)

//第六节
//二维数组与指针
//二维数组的理解:由n个以为数组所组成的
int i, j;
double score[5][3] = {
{55, 66, 77},
{25, 36, 47},
{51, 67, 17},
{15, 64, 87},
{12, 56, 37}
};
//遍历第一行数组:第一行数组名就是score[0]
for(i = 0; i < 5; i++)
{
for(j = 0; j < 3; j++)
{
printf("%.0lf\t", score[i][j]);
//一维数组里:score[i] => *(score[i] + i) => *(score + i)
//二维数组里:score[i][j] => *(score[i] + j) => *(*(score + i) + j)
}
printf("\n");
}

//第五节
//数组逆序
//原理:首位元素进行交换
//公示 第i个元素和第N - i - 1个元素交换
int array[] = {15, 20, 25, 30, 35};
int temp; //临时变量
int i;
int * ptr_array_statr = array; //指向数组首元素的指针
int * ptr_array_end = array + 4; //指向数组尾元素的指针
//指针交换思路
//定义两个指针 ptr1 ptr2
while(ptr_array_statr != ptr_array_end) //存在BUG只支持元素数量为单数的数组
{
//首尾交换,指针进行移动
temp = *ptr_array_statr;
*ptr_array_statr = *ptr_array_end;
*ptr_array_end = temp;
//首元素指针向后移动
ptr_array_statr++;
//尾元素指针向前移动
ptr_array_end--;
}

//标准模式交换
for(i = 0; i < N / 2; i++)
{
//交换:第i个值和第N-i-1个值向交换
temp = array[i];
array[i] = array[N - i - 1];
array[N - i - 1] = temp;
}
for(i = 0; i < N; i++)
{
printf("%d\t", *(array + i));
}
//第四节
int array[] = {15, 20, 25, 30, 35};
int i;
int * ptr_array = array;
//赋值完毕后就可以使用指针访问数组元素
for(i = 0; i < 5; i++)
{
//printf("第%d个元素的值为:%d\t地址为:%p\n", i + 1, array[i], &ptr_array[i]);
//printf("第个%d元素的值为:%d\t地址为:%p\n", i + 1, *(ptr_array + i), ptr_array + i);
printf("第%d个元素的值为:%d\t地址为:%p\n", i + 1, *ptr_array, ptr_array);
ptr_array++;
//每次循环都会移动指针的指向 要注意重置
}
//第三节
//数组名就是数组的首地址等价于数组首元素地址
int i;
double score[] = {98,22,13,53,56};
double * ptr_score = score;
printf("double型数组的地址占%d个字节\n", sizeof(ptr_score));
printf("数组的首地址:%p\t数组首元素的地址:%p\n", score,&score[0]);
for(i = 0; i < ; i++)
{
//printf("%.2lf\n", ptr_score[i]);
//printf("%.2lf\n", *(ptr_score + i));推荐,想要打印第几个元素就加几
//printf("%.2lf\n", *ptr_score++);不推荐,因为他会改变指针指向
}

//第二节
int num1 = 1024;
int num2 = 2048;
int * ptr1, * ptr2;
ptr1 = &num1;
ptr2 = &num2;
printf("num1的值是:%d\tnum1的地址是:%p\n", num1, ptr1);
printf("num2的值是:%d\tnum2的地址是:%p\n", num2, ptr2);
//将变量1的值付给变量2
//num2 = num1; 等价于 *ptr1 = *ptr2; 只改变变量不改变地址
ptr2 = ptr1;
printf("num1的值是:%d\tnum1的地址是:%p\n", num1, ptr1);
printf("num2的值是:%d\tnum2的地址是:%p\n", num2, &num2);
//结论:其实指针就是一个变量,它是一个存放了某个变量地址的变量
*ptr2 = 1111;
*ptr1 = 1212;
printf("num1的值是:%d\tnum1的地址是:%p\n", num1, ptr1);
printf("num2的值是:%d\tnum2的地址是:%p\n", num2, &num2);

//第一节
int num = 9;
int * ptr_num = &num;
int ** ptr_num2 = &ptr_num;
//%p是指针占位符 %x 是十六进制占位符
printf("num变量的地址是:%p\t%x\n", ptr_num,&num);
printf("ptr_num指针的地址是:%p\n", ptr_num2);
printf("原空间num对应的值是:%d\n", **ptr_num2);
printf("*ptr_num对应的值是:%d\n", *ptr_num);

return 0;
}