C优点:允许programmer访问程序使用的地址。
程序利用这些地址,用于跟踪保存数据&指令的地方。
11.1 数组名作为指针
指针用于存储地址(c7.3),且与数组名紧密联系在一起。
pointer唯一特征是偏移量offset能包含在使用指针的表达式中。比如*(gPtr+1)中的1是一个偏移量,也就是访问的grade[1]。
地址运算符:&
grade数组第4个的地址是&grade[3]
&grade[3] = &grade[0](基址)+(3*4) //假设每个元素占4个字节
⭐️⭐️⭐️
gPtr = &grade[0];//把地址,存储在指针中
*gPtr = grade[0];//间接运算符(*)指针,就叫“被指针指向的变量
//这块儿有点绕
|||
:-|:-|:-
0|grade[0]|gPtr
...|...|...
4|grade[4]|(gPtr+4)
11.2 指针操作
*指针,相当于是一个变量
指针运算
||
:-|:-
*ptNum++|使用指针,给pointer增1
*++ptNum|使用指针前,给pointer增1
*ptNum--|使用pointer,给pointer减1
*--ptNum|使用pointer前,给pointer减1
#include <stdio.h>
#define NUMELS 5
int main()
{
int nums[NUMELS] = {16, 54, 7, 43, -5};
int i, total = 0, *nPtr;
nPtr = nums; /* store address of nums[0] in nPtr */
for (i = 0; i < NUMELS; i++)
total = total + *nPtr++;//指针运算⭐️⭐️
printf("The total of the array elements is %d\n", total);
return 0;
}
指针初始化
int *ptNum = &miles;
double *zing = &prices[0];
11.3 传递和使用数组地址
当传递数组给函数时,传递的唯一项目实际上是地址。
即,存储这个数组的第一个位置的地址被传递。
即,数组的地址,就是元素0的地址
#include <stdio.h>
#define NUMELS 5
int findMax(int[], int); /* function prototype */
int main()
{
int nums[NUMELS] = {2, 18, 1, 27, 16};
printf("The maximum value is %d\n", findMax(nums,NUMELS));
return 0;
}
int findMax(int vals[], int numEls) /* find the maximum value of the array */
{
int i, max = vals[0];
for (i = 1; i < numEls; i++)
if (max < vals[i])
max = vals[i];
return (max);
}
二维数组
mums[0][0],*(*nums),*nums[0]
mums[0][1],*(*nums+1),*nums([0]+1)
mums[1][0],*(*(nums+1)),*nums[1]
类推
11.4 使用指针处理字符串(略)
比如复制字符串到字符串
11.5 使用指针创建字符串
season[0] = "winter";
season[1] = "spring";
season[2] = "summer";
season[3] = "fall"
#include <stdio.h>
int main()
{
int n;
char *seasons[] = {"Winter",
"Spring",
"Summer",
"Fall"};
for(n = 0; n < 4; ++n)
printf("The season is %s\n.",seasons[n]);
return 0;
}
网友评论