11. 数组、地址和指针 Array, Address, Pointers

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 
#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 
#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 
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;
}

你可能感兴趣的:(11. 数组、地址和指针 Array, Address, Pointers)