C語言陣列

ZXXL發表於2020-12-06

陣列初始化

  1. 連寫
char name[16] = {"XXL");//這種定義是合法的

char name[16];//
name = {"xxl"};//這種初始化是非法的
  1. 下標
int a[3];
a[1] = 100;
a[2] = 200;
  1. 陣列名的解引用
    在地址前加上 * 表示對這塊記憶體上內容的解引用,表示記憶體的內容
int main()
{
	int a[4]
	*a = 100;
	*(a+1) = 200;
	*(a+2) = 300;
}
  1. 用指標變數

一維陣列

a表示第一個成員的首地址
a也表示其定義的整個記憶體空間的地址

int main()
{
/*	int a1 = 100;
	int a2 = 200;
	...
	int a100 = 1000;
*/

	int a[4] = {100,200,0,400,500};
	//int規定了這個記憶體空間當中4個資料的型別;一個32位=4byte
	//申請4個32位記憶體空間,並把這塊空間標記為a;
	printf("a_addr: %p\n", a);
	printf("a[0]_addr: %p\n", &a[0]);
	//a[1]僅表示32位記憶體空間中包含的一個變數
	//這一整塊記憶體的首地址為 &a[0],a表示第一個成員的首地址
	printf("a_addr: %p\n", a+1);
	printf("a[1]_addr: %p\n", &a[1]);

	printf("&a=%\n", &a);
	printf("&a+1%p\n", &a+1);
	printf("a[3]_addr: %p\n", &a[3]);
	//a也表示其定義的整個記憶體空間的地址
	//偏移後移出該空間,距離為陣列型別大小(int為4個byte),可比較 &a[3] 與 &a+1
	
	const int buffer[3] = {0};
	//陣列也可用關鍵字修飾,此時buffer只讀
	
	float f[3] = {1.2,2.3,3.4};
	char ch[4] = {'h', 'e', '\n'};
	 
	return 0;
}

char型陣列

#include <stdio.h>
#include <string.h>

int main()
{
	char buffer[10] = {'h','e','l','l','o','\0'};
	//表示到棧裡申請10個連續的八位記憶體空間,並把後面這些常量初始化到對應的記憶體空間當中
	// \0 為結束符,表示空(null character)
	
	printf("buffer_size: %ld\n",sizeof(buffer));
	printf("buffer_length: %u\n",(unsigned int)strlen(buffer));
	
	
	char buffer2[] = "hello,kitty";
	printf("buffer2_size: %ld\n", sizeof(buffer2));
	
	
	char name[10] = "hello,kitty";
	//初始化的內容超出記憶體空間,就寫不進去了
	printf("name: %s\n",name);
	printf("%c\n", name[10]);
//	name[11]='x';
	printf("%d\n", name[13]);
	
	int i;
	for(i = 0 ; i <= 15 ; i++)
	{
		printf("%p\n", *(name + i));
	}
	
	char abb = 'c';
	printf("%p\n", abb); 
	
	char name1[3]="kk";
	int x = 88;
	printf("%p\n", &name[3];
	printf("%p\n", &name1+1);
	printf("x=%p\n", &x);
	//觀察結果,&x 與 &name1+1 隔7個byte(按照32位記憶體對齊)
	//當x也為char型時,記憶體隔3個byte(32位記憶體對齊)
	
	return 0;
}

二維陣列

二維陣列的實際實體記憶體仍是一維的,為了便於理解具象為二維平面

#include <stdio.h>

int main()
{
	
	int i,j;
	
	int data[3][3] =  {{1,2,3},{1,2,3},{1,2,3}};
	
	printf("data_addr: %p\n\n", &data);
	
	for(i = 0; i < 3; i++)
	{
		for(j = 0; j < 3; j++)
		{
			printf("data[%d][%d] = %d\n", i, j, data[i][i]);
			printf("ptr_data = %p\n", &(data[i][j]));
		}
	}
	
	
	return 0;
}

指標偏移量與記憶體地址的關係

#include <stdio.h>

int main()
{

	int i,j; 
	
	char name[4][3] = {"akk","955","98k"};

	
	printf("name_addr = %p\n", name) ;
	printf("&name[0][0] = %p\n\n", &name[0][0]);//二維陣列首地址
	 
	
	for(i = 0; i < 4; i++)
	{
		for(j = 0; j < 3; j++)
		{
			printf("name[%d][%d] = %c\n", i, j, name[i][j]);
			// 按順序列印12個地址上的內容 
			printf("name[%d][%d]_addr = %p\n\n", i, j, *(*(name + i) + j));
			//按順序列印12個地址 
		}
	}

	printf("------------------------------------\n\n");

	char (*p)[3]= name;	
	
	printf("p_addr: %p\n\n", p);
	
	
	for(i = 0; i < 3; i++)
	{
		
		printf("p + %d = %s\n", i, p + i);		//指標偏移 
		printf("& p + %d = %p\n", i, &p+i);
		printf("(*p)[%d] = %c\n", i, (*p)[i]);
		printf("(*P)[%d]_addr: %p\n\n", i, &(*p)[i]);
	}

	
	return 0;
}

結果如下

結構體陣列

它與前面講的數值型陣列幾乎是一模一樣的,只不過需要注意的是,結構體陣列的每一個元素都是一個結構體型別的變數,都包含結構體中所有的成員項。
定義結構體陣列的方法很簡單,同定義結構體變數是一樣的,只不過將變數改成陣列。或者說同前面介紹的普通陣列的定義是一模一樣的

typedef struct STUDENT
{
	char name[10];
	int age;
	char sex;
	
	struct score
	{
		float che;
		float mat;
		float eng;
	}s;
}student;

int main()
{
	int i;
	student stu[10] = {{"kitty",18,'m',88.88},{"kfc",24,'f'},};
	//這就定義了一個結構體陣列,共有 10 個元素,每個元素都是一個結構體變數,都包含所有的結構體成員。

	for(i = 0; i < N; i++)
	{
		printf("name: %s, age: %d, sex: %c, che: %f, mat: %f, eng: %f\n",stu[i].name, stu[i].age, stu[i].sex, stu[i].s.che, stu[i].s.mat, stu[i].s.eng);
	}

return 0;
}

相關文章