C language array

array

int a0,a1; -> This thing cannot be referenced through a loop. The name cannot be split. Arrays are introduced into all C languages

Array definition:

An array is a collection of data (variables) of the same type
​ int a0,a1…a99; -> If it is defined by an array - > a [100] represents 100 integer data

One dimensional array

Defined format

The definition of one-dimensional array follows the definition of variable (type of variable, name of variable;)
The definition of one-dimensional array is the same:

Type of variable [number of variables] name of variable;

Since it's written above, isn't our definition of array
​ int[10] a;
There is no type int[10] in c language, so this [10] can only be put later, so the definition of array is

Type of variable name of variable [number of variables];

Example:
​ int a[10]; Number of variables - > number of data representing the same class
a has two meanings:

​ 1. The first address of the array is equivalent to a pointer to the first address of the array

​ 2. Variable representing the entire array

int main()
{
    int a[10];
    int *p = a;
    sizeof(a);			//40, because a is a variable that represents the entire array. sizeof(a) -> sizeof(int[10])
	sizeof(p);    		//4/8 
}
//sizeof (array name): returns the number of bytes of memory space occupied by all elements of the array.

//sizeof (pointer): returns the number of address bytes of the computer system. If it is a 32-bit system, it returns 4, and if it is a 64 bit system, it returns 8

Relevant requirements:

Variable type: all legal types in c language can be used, such as basic type and construction type

Variable name: it is OK to comply with the naming rules of c language

Number of variables: in the old compiler, there can only be constant expressions. Up to now, we can use a variable with definite value to give this number

Note: if you define an array with variables, you cannot initialize it

Example:

	int a[5];
	//It means that five variables with the same int are defined
	//If you want to use these five variables, just use this a directly
	//Typeof - > find the type of a variable
	//typeof(a) -> int[5]
	int * p = a;
	//typeof(p) -> int *
	//int[5] int * is the same in a great sense, but it is also different. Int * has no range, and int[5] determines the range

Storage of array in memory:

Introduction:

The array is defined. To use it, we also need to know the address of the array, that is, the storage of these data in memory

Memory distribution of array:

After the array is defined, each element in the array is in a continuous address space, and the second one is stored next to the first one
[the transfer of external chain pictures fails, and the source station may have anti-theft chain mechanism. It is recommended to save the pictures and upload them directly (img-uUh8nu8C-1622254834325)(F:\Typora \ Guangdong embedded learning notes \ storage of array. png)]

Reference to array:

Use the index of the array to refer to the array
Array name [subscript]; The subscript starts from 0 and is less than the number of arrays
Examples
​ int a[10];
A [0] - > the first element of the array
A [1] - > the second element of the array
​ ...
A [9] - > the tenth and last element of the array
Arrays are as like as two peas.
How to use variables, then how to use the elements of the array
Examples
​ int b;
​ b = 1024;
​ int a[10];
​ a[0] = 1024;
​ a[9] = 1025;
Like ordinary variables, it conforms to the rules of left value and right value
Therefore, the same elements of the array can be addressed
practice:
Define an array, manually enter the value in it, use the loop, and print out the array

		int a[10];
		int i;
		for(i = 0;i < 10;i++)
		{
			scanf("%d",&a[i]);
		}
		for(i = 0;i < 10;i++)
		{
			printf("%d\t",a[i]);
		}
		printf("\n");

​ int a[10];
​ scanf("%d",&a); // may not
​ typeof(a) -> int[10]
​ typeof(&a) -> typeof(&int[10]) -> int[10] * -> int **
Indicates the address of the entire array, and the address of the entire array represents the entire array
The first address of the array represents the first element of the array
For example:
A + 1 - > represents the second element
& A + 1 - > means skip this array

​ int a[10];
​ scanf("%d",a); a -> &a[0]
It's OK to write this way. a represents the first element and it's an address

*Key points:

a represents the first address and the address of the first element
Therefore, both left and right values are OK
​ * a = 1024; <-> a[0] = 1024
+ + a,a + + doesn't work
a + 1 is OK
Core thinking: Although a is the first address and a represents the address of the first element
And a itself is a variable
But since a represents the whole address, if you change it, the array will change
Therefore, a cannot be changed
So a =a + 1 doesn't work either

Array initialization:

After the array is defined, we can give the initial value directly
Type of variable name of variable [number of variables] = {};
After the array is defined, we initialize it all
For example:

int a[5] = {1,2,3,4,5};			//Do not exceed the standard
char name[10] = "abcdefghi";	//String must be followed by \ 0

2 array can be partially initialized, and the parts not initialized later will be initialized to 0
For example:

int a[5] = {1,2,3}; // a[3] == 0 , a[4] == 0

Array is not initialized. The value inside is unknown. Many times, we can clear an array

	int a[5] = {0};

*Note:

​ int a[5] = {0};
After unknown operations, this a is likely to be used, so there are various values in it
At this time, I want to clear this array again

Then many people will do this - > A = 0; This must not be done
This can only be done at the time of definition, that is, initialization
​ int a[5] = {0};

The rest of the time I want to set 0 can only cycle
Memset - > is actually implemented in a loop

If I want to initialize all the arrays, I don't need to give the number when defining the array. The compiler can guess how many you have

int a[] = {1,2,3,4,5};
//And int a[5] = {1,2,3,4,5}; As like as two peas

The length of the string (strlen) and the size of the array (sizeof)

There is a special existence in the array, string array, which involves two concepts, string length and array size

//Example 1:
char name[16] = "penglei";
printf("%d\n",sizeof(name));	//Find the size of the array and output 16, indicating that the size of the array is 16 bytes
printf("%d\n",strlen(name));	//Find the length of the string, encounter the end of \ 0, and the output result is 7
			
char name[] = "penglei\0henshuai";
printf("%d\n",sizeof(name));	//Find the size of the array and output 17. The end of the string must end with \ 0
printf("%d\n",strlen(name));	//Find the length of the string, encounter the end of \ 0, and the output result is 7

//Example 2:
	int i;
	char name[3] = {'a','b','c'};
	printf("%d\n",sizeof(name));	//Find the size of the array and output 3, indicating that the size of the array is 3 bytes
	printf("%d\n",strlen(name));	//The result is unknown. I don't know how much is behind the array. I don't know when I can meet the end of \ 0
				
	char name[3];
	char name1[10];
	for(i=0;i<7;i++)
	{
		scanf("%c",&name[i]); //-> {'a','b','c','d','e','f','g'}
	}
	name1[0] = 'h';
	printf("%s\n",name);	// Output result - > ABC
	printf("%s\n",name1);	//Output result - > hefg

Array allocation does not depend on who defines it first
It depends on who is smaller, who is in front and opens up continuously
Both% s and strlen need to see \ 0 to end

	name1 = "h"; //In c language, strings cannot be assigned directly, so this sentence is wrong
		We want the assignment string to be a byte by byte assignment only
		Only during initialization can it be directly equal to
		
be careful:
	2.c Although the code has some problems, it explains a lot of problems
	Be sure to take time to understand

practice:
1 find the sum of an array and print the largest and smallest

	for(i = 0;i < n;i++)
	{
		sum += a[i];
		//Update maximum and minimum values
		if(max < a[i])
		{
			max = a[i];
		}
		if(min > a[i])
		{
			min = a[i];
		}
		
	}


2 fiboracci sequence, print the sum of the first 20 items and the first 20 items
​ 1 1 2 3 5 8 13 ...
​ int a[20] = {1,1};
​ sum = 2;
​ i = 2;
​ for(;i < 20;i++)
​ {
​ a[i] = a[i - 1] + a[i - 2];
​ sum += a[i];
​ }
​ for(i = 0;i < 20;i++)
​ {
​ printf("%d ",a[i]);
​ }
​ printf("\nsum = %d\n",sum);

3 given a sequence, judge whether the sequence is increasing
If yes, otherwise no
​ int a[10];
​ for(i = 0;i < 9;i++)
​ {
If (a [i] > = a [i + 1]) / / as long as there is such an item, it is not incremental
​ {
​ printf("no\n");
​ break;
​ //return 0;
​ }
​ }
if(9 == i) / / if there is no break, it is incremented
​ {
​ printf("yes\n");
​ }

4 given an ordered sequence of numbers, find one of the elements
1. Traverse - > find one by one
2 dichotomy - > compromise search
​ int arr[n];// Give this array yourself
​ int left = 0,right = n;
​ int mid = (left + right) / 2;
While (left < = right) / / I don't know how many times it will cycle. If we find a break, we also need to end it
​ {
/ / compromise search is to find the middle number a[mid]
If (arr [mid] > x) / / indicates that the mid position is on the right side of X. I want to move the right side
​ {
​ right = mid - 1;// At least the first one to the left of the mid
​ mid = (left + right) / 2;
​ }
Else if (arr [mid] < x) / / X is on the right of mid
​ {
​ left = mid + 1;
​ mid = (left + right) / 2;
​ }
else / / equal
​ {
printf("found \ n");
​ break;
​ }
​ }
​ if(left > right)
​ {
printf("not found \ n");
​ }


5 sorting algorithm
1 bubbling - > one bubbling will move the maximum value to the last
As long as the previous value is greater than the latter value, change the position

​ arr[10];
​ int i,j;
​ for(i = 0;i < 9;i++)
​ {
For (J = 0; J < 9; j + +) / / this is one of them
​ {
If (arr [J] > arr [J + 1]) / / as long as the following value is smaller than me, it needs to be exchanged
​ {
​ arr[j] = arr[j] ^ arr[j +1];
​ arr[j +1] = arr[j] ^ arr[j +1];
​ arr[j] = arr[j] ^ arr[j +1];
​ }
​ }

​ }

Job:
1 Select Sorting - > find out the maximum value that is not arranged in one trip and put it on the last side that is not arranged
We need to save the subscript of the maximum value

2 Find the second largest value in the array
	When updating the maximum value, you can change the maximum value before updating to the second largest value
	If a value is larger than the second largest value but smaller than the first largest value, update the second largest value directly

3 Place negative numbers in an array before positive numbers
	so easy!!!

4 Insert sorting, and the sequence will be arranged after the insertion is completed
	See 4.c

5 Random sorting  -> Think for yourself
	Demand 1 ~ 100 Randomly distributed into an array of 100 elements
	The number in the array will not be repeated
	1 	int arr[100] = {0};
		int i,j;
		srand((int)time(NULL));
		for(i = 1;i <= 100;i++)
		{
			while(1)
			{
				//Random subscript
				j = rand() % 100;//Random can be a number between 0 and 99, and this number can be regarded as a subscript
				//The subscript has been randomly selected, so we can consider inserting this number into this subscript
				//When you insert it, the element should be 0. If it is not 0, you should not insert it
				if(0 == arr[j])
				{
					arr[j] = i;//If the remaining number is very small, it is difficult to ensure that it can be inserted on time
							//There may not be random subscripts
							//This algorithm can only exist in theory
					break;
				}
			}
		}
	2 There is no way to consider the position of 0 by improving the above method 
		Improve the location of 0
		Isn't the random position of 0 OK
		Just open an array to save the position of 0. The position of 0 is the insertion position
		int arr[100] = {0};
		int add[100] = {0};
		int num_0 = 0;
		int i,j,k;
		srand((int)time(NULL));
		for(i = 1;i <= 100;i++)
		{
			num_0 = 0;//Set the number of 0 to 0
			//Count the number of 0 and save the location of 0
			for(j = 0,k = 0;j < 100;j++)
			{
				if(0 == arr[j])//Find a 0
				{
					num_0++;
					add[k] = j;//Save the position of 0 in the add array
					k++;//After saving one, you need to save the next one later
				}//After this cycle, the position of 0 is saved and the number is saved
			}
			//The insertion position can be found by the number of random 0
			arr[add[rand() % num_0]] = i; //Random location and find the real subscript of this place		
		}
	
	3 It's OK to continue the above, but it's a little difficult to think about
		The last unordered number randomly exchanges positions with the previous number
		It can be achieved by moving forward in turn
		//Write the third code 

random number
There are no random numbers in the computer, and some are pseudo-random
srand((int)time(NULL)); // Divide a position
You only need to call it once. Of course, you can call it many times

	rand()The return value of the function is a pseudo-random number



	How to output multiple random numbers in a loop			

2 multidimensional array
Data type variable name;
Define array - > one-dimensional variable type [number] variable name;
->Variable type variable name [number];

How to define a two-dimensional array according to a one-dimensional array
	Variable type variable name[number];  ->One dimensional array
	Just add a two-dimensional dimension to one dimension
	Variable type[Number of two-dimensional] Variable name[number];	
		-> Variable type variable name[number][Number of two-dimensional];
	The above is the definition of two-dimensional array
		Define format
			Data type array name[Row size][Column size]
	The size of rows and columns is given in the same way as the number in a one-dimensional array
		Generally, we give constant expressions. If you want to use variables, it's OK
			But with variables, you can't initialize
			The variable you use must have a definite value

When using two-dimensional array, our two-dimensional array is through one-dimensional array
Therefore, when using two-dimensional arrays, we can use one-dimensional arrays
In fact, a two-dimensional array is a one-dimensional array
Memory is a one-dimensional

Distribution of two-dimensional array in memory
See Figure

Reference elements in a two-dimensional array
Single element references array name [row] [column]
The rows and columns start from 0
Want to use a row of data array name [row]
->The array name [row] represents a row of data

Since a two-dimensional array is a one-dimensional array, can we make a pointer and directly use a single element in it?
	Sure
		a[0] ->The first line represented is the first address of the first line
		
	Q: a[3][5]
		int * p = a[0]; yes
			The elements in a row are int
			a[0]Represents the first address of this line
			a[0] = &a[0][0]  typeof(&a[0][0]) -> int *
			//int * p = a[0];
			int c;
			typeof(c) d = c;
			typeof(&a[0][0]) p = &a[0][0];
			int * p =  &a[0][0] = a[0]
			
			p = p + 5;//Yes p[5]
					Now? p To whom? a[1][0]


​ int * q = a; no
The whole array is represented by a
So there's a problem with that

Combine the two above
Assume a = 0x0010
Q:
​ a[0] + 1 = 0x0014
a + 1 = 0x0024 plus an int[5]
The actual performance is to jump to the second line
If a is a variable, can a get the address
​ &a + 1 = 0x0010 + 4 * 15
Skip entire array
Int a [3] [5] - > int [5] a [3] - > assuming int[5]=X
​ int[5] a[3] =>X a[3];
​ ->X[3] a;
​ ->int[5][3] a;
​ typeof(a) -> int[5][3]
​ typeof(&a) -> int[5][3] *
​ &a + 1 = 0x0010 + 15 * 4

	int a[3];  a= &a[0]
	int * p = a;

Initialization of two-dimensional array
1 we can initialize the two-dimensional array
int a[2][3] = {
{1,2,3},
{4,5,6}
};
We can write the above form in a or brackets
int a[2][3] = {
1,2,3,4,5,6
};

3 Partial initialization. The remaining uninitialized ones will be automatically set to 0
	int a[2][3] = {
		{1,2},   //The first line initializes 2 and the third is 0
		{4,5}	//The second line initializes 2, and the third line is 0
	};
	int a[2][3] = {
		1,2,   
		4,5	
	};   -> The first line is all initialized  	1 2 4
			The second line initializes only one	5 0 0

4  If a two-dimensional array is fully initialized, we can omit it
	The number of rows, but columns cannot be omitted
	int a[][3] = {
		{1,2,3},
		{4,5,6}	
	};
	perhaps
	int a[][3] = {
		1,2,3,4,5,6				
	};
	
	char name[][16] = {
		"penglei",
		"henshuai",
		.....
	};


int function(int arr[][3])
{

}
int main()
{
int a[2][3];
function(a);

}

practice:
1 find the maximum and minimum of a two-dimensional array
And print out the sum of the array
for()
{
for()
{
...
}
}

2 Find the column and row with the largest sum of elements in a two-dimensional array
int a[3][5];
//It should be the sum of the first row and the first column. I'm too lazy here
int max_lin = a[0][0],max_col = a[0][0];
int sum = 0;
int i,j;
for(i = 0;i < 3;i++)//that 's ok
{
	sum = 0;//Reset and
	for(j = 0;j < 5;j++)
	{
		sum += a[i][j];
	}
	if(max_lin < sum)//Update large value
	{
		max_lin = sum;
	}
}

for(j = 0;j < 5;j++)//column
{
	sum = 0;
	for(i = 0;i < 3;i++)
	{
		sum += a[i][j];//Find the value of a column
	}
	if(max_col < sum)//Update large value
	{
		max_col = sum;
	}
}


3 find the top element
Mountaintop element: the element larger than the left, right, up and down is the mountaintop element
There is no need to consider, but it may also be a mountaintop element

In fact, we don't have to think so much
There are inert operations in c language
If ((left doesn't exist or I'm bigger than you) & & (right doesn't exist or I'm bigger than you)...)
​ {
/ / mountaintop element

​ }

int a[5][5]

	if((j == 0 || a[i][j] > a[i][j - 1]) && (j == 4 || a[i][j] > a[i][j + 1]))
		&& ((i == 0 || a[i][j] > a[i - 1][j]) && (i == 4 || a[i][j] > a[i + 1][j]))
	
	6.c
	
4 Output the first 10 lines of Yanghui triangle
	Regardless of the one on the right
	1
	1 1
	1 2 1
	1 3 3 1
	1 4 6 4 1
	.....
	int i,j;
	int a[10][10] = {0};
	for(i = 0;i < 10;i++)//that 's ok
	{
		for(j = 0;j <= i;j++)
		{
			//We should first consider the case equal to 1
			if(0 == j || i == j)//
			{
				a[i][j] = 1;
			}
			else
			{
				//If it is not 1, this value is equal to the one above it plus the one on the left above it
				a[i][j] = a[i -1][j] + a[i - 1][j - 1];
			}
			printf("%4d ",a[i][j]);
		}
		printf("\n");
	}
	
	7.c


5. High data occupancy problem
There is a man named Gao data. He wants to take seats for him and his two roommates (3 people)
It has a habit that it can't be separated from its roommate and can't sit back and forth
Only three people can be connected together and some seats have been occupied
Write code to find out how many occupation methods they have
Go and give this seat yourself

​ if(!a[i][j] && !a[i][j+1] && !a[i][j+2] )
​ {
​ num++;
​ }

6 Find the largest subarray of a one-dimensional array(successive)And
	2 -1 -3 4 5 -8 -9 10 11 -2
	The largest subarray is
		10 11 The sum is 21
	1 Brute force crack all situations of liejue to get the maximum value
	2 sum As long as it is added to the case less than 0, it is directly equal to 0
	int a[10] = {1,-2,-3,4,5,3,-5,20,-30,10};
	int sum = a[0];
	int sum_max = sum;
	int i = 0;
	for( ;i < 10;i++)
	{
		sum += a[i];
		if(sum < 0)
		{
			sum = 0;
		}
		if(sum_max < sum)
		{
			sum_max = sum;//Update max
		}		
	}
	if(sum_max < 0)
	{
		//Just traverse the maximum value
	}
	
	8.c


printf("\n");
}

	7.c


5. High data occupancy problem
There is a man named Gao data. He wants to take seats for him and his two roommates (3 people)
It has a habit that it can't be separated from its roommate and can't sit back and forth
Only three people can be connected together and some seats have been occupied
Write code to find out how many occupation methods they have
Go and give this seat yourself

​ if(!a[i][j] && !a[i][j+1] && !a[i][j+2] )
​ {
​ num++;
​ }

6 Find the largest subarray of a one-dimensional array(successive)And
	2 -1 -3 4 5 -8 -9 10 11 -2
	The largest subarray is
		10 11 And 21
	1 Brute force crack all situations of liejue to get the maximum value
	2 sum As long as it is added to the case less than 0, it is directly equal to 0
	int a[10] = {1,-2,-3,4,5,3,-5,20,-30,10};
	int sum = a[0];
	int sum_max = sum;
	int i = 0;
	for( ;i < 10;i++)
	{
		sum += a[i];
		if(sum < 0)
		{
			sum = 0;
		}
		if(sum_max < sum)
		{
			sum_max = sum;//Update max
		}		
	}
	if(sum_max < 0)
	{
		//Just traverse the maximum value
	}
	
	8.c


Keywords: C

Added by johncollins on Tue, 08 Feb 2022 03:25:32 +0200