当前位置:网站首页>C language - array

C language - array

2022-07-07 01:17:00 Small protrusion ~

Catalog

1. One dimensional array creation and initialization

1.1 Array creation

 1.2 Initialization of an array

​ edit  1.3 The use of one-dimensional arrays

1.4 One dimensional array storage in memory  

2. The creation and initialization of two-dimensional array    

2.1 The creation of two-dimensional array  

2.2 Initialization of 2D array

2.3 The use of two-dimensional arrays

2.4 Two dimensional array storage in memory  

3. An array

4. Arrays as function arguments  

4.1  Wrong design of bubble sort function

4.2 What is the array name ? 

4.3 Correct design of bubble sorting function  


1. One dimensional array creation and initialization

1.1 Array creation

An array is a collection of elements of the same type

How to create an array :

type_t  arr_name  [const_n];
//type_t  Is the element type of the exponential group 
//const_n  Is a constant expression , Used to specify the size of an array 

An instance created by an array :

notes :C99 The concept of variable length array is introduced in , Allow the size of the array to be specified by variables , If the compiler does not support C99 Variable length array in , Then you can't use .

 1.2 Initialization of an array

The initialization of an array refers to , While creating an array, give the contents of the array some reasonable initial values ( initialization ).

int arr1[10] = {1,2,3};
int arr2[] = {1,2,3,4};
int arr3[5] = {1,2,3,4,5};
char arr4[3] = {'a',98, 'c'};
char arr5[] = {'a','b','c'};
char arr6[] = "abcdef";

If you want to create an array without specifying the size of the array, you have to initialize it . The number of elements in the array is determined according to the contents of initialization . 

But for the following code to distinguish , How to allocate in memory .

char arr1[] = "abc";
char arr2[3] = {'a','b','c'};

 1.3 The use of one-dimensional arrays

  about The use of arrays, we introduced an operator before : [ ] , Subscript reference operator . It's actually an array access operator

#include <stdio.h>
int main()
{
int arr[10] = {0};// Incomplete initialization of arrays 
  // Count the number of elements in an array 
  int sz = sizeof(arr)/sizeof(arr[0]);
// Assign values to the contents of the array , Arrays are accessed using subscripts , Subscript from 0 Start . therefore :
int i = 0;// Do subscripts 
for(i=0; i<10; i++)// Write here 10, Ok or not ?
{
arr[i] = i;
}
// Output the contents of the array 
for(i=0; i<10; ++i)
{
printf("%d ", arr[i]);
}
return 0;
}

Arrays are accessed using subscripts , The subscript is from 0 Start . The size of the array can be calculated .

1.4 One dimensional array storage in memory  

int main
{
	int arr[10] = {1,2,3,4,5,6,7,8,9,10};
	int sz = sizeof(arr) / sizeof(arr[0]);
	int i = 0;

	int* p = &arr[0];
	for (i = 0; i < sz; i++)
	{
		printf("%d ", *(p + i));
	}
	printf("\n");
	for (i = 0; i < sz; i++)
	{
		printf("&arr[%d] = %p <=======> %p\n", i, &arr[i], p + i);
	}
	return 0;
}

Watch the output carefully , We know , As the array subscript grows , Address of element , It's also increasing regularly .
So we can draw a conclusion : Arrays are continuously stored in memory . 

2. The creation and initialization of two-dimensional array    

2.1 The creation of two-dimensional array  

// Array creation 
int arr[3][4];
char arr[3][5];
double arr[2][4];

2.2 Initialization of 2D array

// Array initialization 
int arr[3][4] = {1,2,3,4};
int arr[3][4] = {
   {1,2},{4,5}};
int arr[][4] = {
   {2,3},{4,5}};// If the two-dimensional array is initialized , Lines can be omitted , Columns cannot be omitted 

2.3 The use of two-dimensional arrays

Two dimensional arrays are also used by subscripts  

#include <stdio.h>
int main()
{
   int arr[3][4] = {0};
   int i = 0;
   for(i=0; i<3; i++)
   {
      int j = 0;
      for(j=0; j<4; j++)
      {
           arr[i][j] = i*4+j;}
      }
   for(i=0; i<3; i++)
   {
      int j = 0;
      for(j=0; j<4; j++)
      {
           printf("%d ", arr[i][j]);
      }
   }
   return 0;
}

2.4 Two dimensional array storage in memory  

Like a one-dimensional array , Here we try to print each element of a two-dimensional array .

int main()
{
	int arr[][5] = { {1,2},{3,4},{5,6} };

	int i = 0;
	for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
	{
		int j = 0;
		for (j = 0; j < sizeof(arr[0]) / sizeof(arr[0][0]); j++)
		{
			printf("&arr[%d][%d] = %p\n",i,j ,&arr[i][j]);
		}
	}
	return 0;
}

  Through the results, we can analyze , In fact, two-dimensional arrays are also stored continuously in memory  

3. An array

The subscript of an array is range limited .
The next stipulation of the array is from 0 At the beginning , If the array has n Elements , The subscript of the last element is n-1.
So if the subscript of the array is less than 0, Or greater than n-1, The array is accessed out of bounds , Access beyond the legal space of the array .
C The language itself does not check the bounds of array subscripts , The compiler does not necessarily report an error , But the compiler does not report an error , That doesn't mean the program is right ,
So when programmers write code , You'd better do cross-border inspection yourself .

#include <stdio.h>
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
  int i = 0;
  for(i=0; i<=10; i++)
 {
    printf("%d\n", arr[i]);// When i be equal to 10 When , Cross border visit 
 }
return 0;
}

Rows and columns of two-dimensional arrays may also be out of bounds .

4. Arrays as function arguments  

Often when we write code , Will pass the array as an argument to a function  , such as : I want to implement a bubble sort ( Here is the idea of algorithm ) The function sorts an integer array .

4.1  Wrong design of bubble sort function

#include <stdio.h>
void bubble_sort(int arr[])
{
int sz = sizeof(arr)/sizeof(arr[0]);// Is that right ?
  int i = 0;
for(i=0; i<sz-1; i++)
 {
    int j = 0;
    for(j=0; j<sz-i-1; j++)
   {
      if(arr[j] > arr[j+1])
     {
        int tmp = arr[j];
        arr[j] = arr[j+1];
        arr[j+1] = tmp;
     }
   }
 }
}
int main()
{
  int arr[] = {3,1,7,5,8,9,0,2,4,6};
  bubble_sort(arr);// Whether it can be sorted normally ?
  for(i=0; i<sizeof(arr)/sizeof(arr[0]); i++)
 {
    printf("%d ", arr[i]);
 }
  return 0;
}

There is something wrong with this method , Let's find a problem , After debugging, you can see bubble_sort intra-function sz , yes 1.
When an array is used as a function parameter , Instead of passing the entire array ?
  

4.2 What is the array name ? 

Yes 2 Exceptions :
1.sizeof( Array name ), The array name is not the address of the first element of the array , The array name represents the entire array , It calculates the size of the entire array .
2. & Array name , The array name is not the address of the first element of the array , The array name represents the entire array , It takes out the address of the entire array  

In addition to this 1,2 Except for two cases , All array names represent the address of the first element of the array . 

4.3 Correct design of bubble sorting function  

#include <stdio.h>
// It's essentially a pointer  void bubble_sort(int* arr)
void bubble_sort(int arr[],int sz)
{
	//int sz = sizeof(arr) / sizeof(arr[0]);// It doesn't work out sz, Because only one pointer was passed .
	int i = 0;
	// Number of trips 
	for (i = 0; i < sz; i++)
	{
		int flag = 1;// The assumption is ascending 
		int j = 0;
		for (j = 0; j <sz-1-i; j++)
		{
			// In exchange for 
			if (arr[j] > arr[j + 1])
			{
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
				flag = 0;
			}
			if (1 == flag) 
			{
				break;
			}
		}
	}
}

int main()
{
	int arr[] = {10,9,8,7,6,5,4,3,2,1};
	int sz = sizeof(arr) / sizeof(arr[0]);
	bubble_sort(arr,sz);
	//int sz = sizeof(arr) / sizeof(arr[0]);
	int i = 0;
	for (i = 0; i < sz; i++)
	{
       printf("%d ", arr[i]);
	}
	
	return 0;
}

原网站

版权声明
本文为[Small protrusion ~]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/188/202207061730051255.html