I tried to understand the pointer of C in my own way 1

Introduction

Since the beginning of the year, I will be an embedded engineer or an IoT engineer, so I am studying C language. However, when I use C language pointers, I often get the following warning (error).

Warning (error)


#include <stdio.h>
void main()
{
  int *pa;
  pa = 5;
}
//Post-compile warning
incompatible integer to pointer conversion assigning to 'int *' from 'int' [-Wint-conversion]

The above example is a simple example of assignment failure to a pointer variable, but since it became difficult to understand when various pointers and arrays were involved, the pointers were interpreted as ** pointer level ** to summarize the assignment. Saw.

What is a pointer level?

** Think of pointers and arrays at the level! ** ** What that means ... ** The idea that you can assign to pointers with the same level. ** ** The fluctuation of the pointer level is as follows. ** ** [At the time of variable declaration] -Pointer at the time of declaration: The level goes up by the number of \ *. -Arrangement at the time of declaration: The level goes up by the number of []. [In the formula] ・ & In the formula: Level goes up. ・ The level goes down by the number of \ *: * in the formula. -Array in the formula: The level is lowered by the number of [].

Example


#inclde <stdio.h>
void main()
{
  //Since it is the time of declaration*When[]The pointer level goes up by the number of!
  int icount = 0;  //Pointer level 0
  int *picount;  //Pointer level 1
  int **ppicount;  //Pointer level 2
  int sicount[3][2];  //Pointer level 2

  //Because it's an expression&Raises the pointer level,*When[]The pointer level goes down by the number of!
  picount = &icount; //icount is pointer level 1
  *picount = 1;  //picount is pointer level 0
  ppicount = &picount; //ppicount is pointer level 2 picount is pointer level 2.
  sicount[0][1] = 2;  //discount is pointer level 0

Let's consider various patterns at the pointer level with reference to the above example. If you don't know what a pointer is, please refer to Bitter C and Dot Install. Strictly speaking, pointers and arrays are completely different things. Click here for details

Let's sample!

Sample code collection

integer


#include <stdio.h>

int main(void)
{
  int inum;
  int *pinum;  /*Pointer level 1*/

  pinum = &inum;  /*Pointer level 1=Pointer level 1(Level (0+ 1)) */

  *pinum = 100;  /*Pointer level 0= Pointer level 0*/
  printf("%d¥n", inum); // 100

  inum = 200;
  printf("%d¥n", *pinum);  //200

  return 0;

}

Array 1


#include <stdio.h>

int main(void)
{
  int siarr[4] = {1,2,3,4};  //Pointer level 1
  int *pinum;  //Pointer level 1

  pinum = siarr;  //Pointer level 1=Pointer level 1
  printf("%d¥n", *pinum); //1

  return 0;

}

Array 2


#include <stdio.h>

int main(void)
{
  int siarr[4] = {1,2,3,4};  //Pointer level 1
  int *pinum;  //Pointer level 1

  pinum = &siarr[2];  //Pointer level 1=Pointer level 1(level(1 + 1 - 1))
  printf("%d¥n", *pinum); //3

  return 0;

}

Array 3


#include <stdio.h>

int main(void)
{
  int siarr[2][4] = {{1,2,3,4},{10,20,30,40}};  //Pointer level 2
  int *pinum;  //Pointer level 1

  pinum = &siarr[1][2];  //Pointer level 1=Pointer level 1(level(1 + 2 - 2))
  printf("%d¥n", *pinum); //30

  return 0;

}

Array 4


#include <stdio.h>

int main(void)
{
  int siarr[2][4] = {{1,2,3,4},{10,20,30,40}};  //Pointer level 2
  int (*pinum)[4];  //Pointer level 2

  pinum = siarr;  //Pointer level 2=Pointer level 2
  printf("%d¥n", pinum[0][2]);  //3

  return 0;

}

Array 5


#include <stdio.h>

int main(void)
{
  int icount;
  int siarr[4] = {1,2,3,4};  //Pointer level 1
  int *pinum[4];  //Pointer level 2

  for(icount = 0; icount < 4; icount++){
    pinum[icount] = &siarr[icount];  //Pointer level 1=Pointer level 1(Level 1+1-1)
  }
  printf("%d¥n", *pinum[1]);  //2
  return 0;

}

Array 6


#include <stdio.h>

int main(void)
{
  char *psstr1[] = {"abc", "def", "ghi"};  //Pointer level 2
  char *psstr2[2];  //Pointer level 2

  psstr2[1] = psstr1[2];  //Pointer level 1 (level(2 - 1)) =Pointer level 1(level(2 - 1))

  printf("%s¥n", psstr2[2]); //Pointer level 1 abc
  //%s represents a character string (array). Since the array is pointer level 1, the value must also be pointer level 1.

  return 0;

}

Pointer pointer 1


#include <stdio.h>

int main(void)
{
  int inum = 5;  //Pointer level 0
  int *pinum;  //Pointer level 1
  int **ppinum;  //Pointer level 2

  pinum = &inum;  //Pointer level 1=Pointer level 1(Level (0+ 1))
  printf("%d¥n", *pinum); //5

  ppinum = &pinum;  //Pointer level 2=Pointer level 2 (level (1)+ 1))
  printf("%d¥n", **ppinum); //5

  return 0;

}

Pointer pointer 2


#include <stdio.h>

int main(void)
{
  int icount;
  char *psstr[] = {"abc", "def", "ghi"};  //Pointer level 2
  char **ppstr;  //Pointer level 2

  ppstr = psstr;  //Pointer level 2

  for(icount = 0; icount < 3; icount++){
    printf("%s¥n",ppstr[icount]);  //Pointer level 1(level(2 - 1)) abc def ghi
  }
  return 0;
}

That's all for now. Structure and function pointers continue to the next time.

Please note that this is your own style. I want to get used to pointers in this way and be able to write naturally ...

We look forward to your suggestions and harsh opinions.

Recommended Posts