您的位置:首页 > 编程语言 > C语言/C++

[黑马程序员]08[C语言]数组部分学习总结

2015-04-15 01:50 267 查看
-------
android培训、java培训IOS培训、期待与您交流! ----------

1. 数组的基本概念

//int main()
//{
// //intnums[5];
// //表示的涵义是声明了5个int类型的变量,分别是:nums[0],nums[1],nums[2]....
//
// //数组的初始化:
// //1.如果不初始化,会有垃圾数
// //2.和变量的使用一样需要先定义,再初始化,再使用(一般情况)
// //初始化方法:
// //1>定义数组再初始化
// //2>定义同时初始化(可以使用变量作为数组的长度)
// //3>由用户输入数字,确定数组的长度,再使用循环进行初始化(从c99才开始可行),最好用宏定义进行替换
//
// return 0;
//}

//数组练习:

//这种动态分配数据兼容性很好,上面的在早期编译环境下可能无法通过,性能比上面好一点点(可忽略)[更普遍的用法]

//#define LEN 256
//
//int main()
//{
// //使用宏定义定义一个数组
// //需要有一个变量记录一共输入了多少个数字
// //每次输入数字的时候让这个数++
//
// //尝试使用循环初始化数组,如果用户输入的是q表示输入结束,进行统计
// int i =0,num,temp,nums[LEN];
// char ch;
// while (1) {
// temp=scanf("%d",&num);//temp =scanf(%d,&num), temp获取的时scanf函数获取值的个数,只能为0或者1
//
// if (temp==1) {
// nums[i++] =num;
// }else
// {
// scanf("%c",&ch);
// if (ch =='q') {
// break;
// }
// }
// }
//// int n;
////
//// int number = scanf("%d",&n);
////
//// return 0;
// return 0;
//}

//数组练习:打印n的二进制格式

//利用一个数组和一个变量模拟栈结构

//int main()
//{
// int i,nums[10];
//
// nums[i++]=10;
//
// //取数据
// nums[i--];
//
// return 0;
//}
//int main()
//{
// int num =-2,len =0,nums[256],temp;
//
// for (int i=0; i <32; i++) {
// temp = num &1;
// num>>=1;
// nums[len++]= temp;
// }
//
// for (int i =0; i <32; i++) {
// printf("%d",nums[--len]);
// }
// printf("\n");
//
// return 0;
//}

//练习04:用户输入字符,统计字符出现个数

int main()
{
//方法1:
//只需要一个int型数组intnums[256]
//初始全为0;
//把下标与字符一一对应,出现某字符直接在该字符对应的数组元素位置+1

//方法2:
//int nums[256]
//char chs[256]
//两个数组构成一一对应的关系
//用户每次输入一个字符,判断是否子啊字符数组中,不如不在在数组的结尾追加字符
//并在数字数组的结尾追加一个1
//如果字符存在,就在字符数组中找出字符的位置i
//取出数字数组中位置为i的数据自增,即nums[i]++

char chs[256] ={0};

char ch;

//用户一次性输入,回车结束
while (1) {

scanf("%c",&ch);

if (ch =='\n') {

break;
}else
{
chs[ch]++;
}
}

for (int i =0; i<256; i++) {

if (chs[i]>0) {

printf("字符%c出现%d次\n",i,chs[i]);
}
}
return
0;
}

2. 数组名作为函数参数

int main()
{
//如果一个函数的参数是一个数组,那么调用函数时,只需要将数组名放到函数参数中即可
//传递的时数组的首地址,可以使用nums[i]来访问数组里面的某一个元素

//int array[10] ={,,,,,,,};
return
0;
}

//希望初始化:全为0,全为1,全为-1
void iniWithZero(int nums[10])
{

}

//sizeof可以计算出数组的长度
//sizeof(nums)/sizeof(int);
//一维数组作为函数参数的时候,方括号的数字可以省略,传入的数组长度永远会打印8
//使用数组名作为函数参数的时候,应该附带一个int参数表示数组的长度

//3.数组是一个常量,指针是变量

//int length;
//length表示数组中有几个数据是可以使用的
//当执行nums[length++]=1;
//length标记了数组的长度
//length还可以用来进行循环遍历
//length记录了数组添加元素的下一个位置

3. 数组排序(主要需要掌握冒泡和二分法)

//1.冒泡排序
//不要求成为算法大师,只是需要熟练使用数组下标
//冒泡排序算法规则:
//比较相邻的两个元素,如果一个较大或者较小,就交换两个元素的位置
//#define LENGTH 11
//void bubble_sort(int*array,int length);
//
//int main()
//{
// int nums[LENGTH] ={3,2,5,4,1,-9,89,34,-34,-1,234};
//
// bubble_sort(nums,LENGTH);
//
// for (int i =0; i <LENGTH; i++) {
// printf("%d ",nums[i]);
// }
// printf("\n");
//
// return 0;
//}
//
//void bubble_sort(int*array,int length)
//{
// for (int i =0; i <length-1; i++) {
// for (int j =0; j <length-i-1; j++) {
// if (array[j]>array[j+1]) {
// int temp =array[j];
// array[j] =array[j+1];
// array[j+1]=temp;
// }
// }
// }
//}

//二分查找

#include
<stdio.h>
#define LENGTH
9

int erFenSort(int *array,int length,int search);

int main()
{
int nums[LENGTH]={1,2,3,4,5,6,7,8,9};

int n =5;

int result =erFenSort(nums,
LENGTH,n);

printf("%d\n",result);

return
0;
}

int erFenSort(int *array,int length,int search)
{
int lower =0;
int higher =length -1;
int mid;
while (lower <= higher) {

//首先计算中间数字
mid = (lower +higher)/2;

if (search ==array[mid]) {

//找到了

return mid;

break;
}else
if(search >array[mid]){

//去右边找
lower = mid+1;
}else{
higher =mid-1;
}
}
//判断是否找到
return -1;
}

void init(int *array)
{
//创建数组
}

void bubbleSort(int *array,int length)
{
//排序
}

4. 访问二维数组成员

//
难点

// 1>二维数组的成员是什么 int nums[2][3];

//
成员:nums[0][0]
成员:nums[0],nums[1];

// 2>首先讨论数组名的使用 int nums[2][3];

//
此时定义了一个二维数组 1)nums (二维数组首地址) 2)nums[0]
将其当做一位数组看,表示这个数组的首地址

//
它们的类型是什么?有什么区别?

// nums+1移动12个字节,nums[0]移动4个字节;
因此nums是数组类型,nums[0]是int类型

//
指针变量的类型是几个字节,那么+1运算是,就移动几个字节

// nums[0]是指向int类型的指针

// *(nums[0]) ==nums[0][0]

// nums是指向数组类型的指针

// *(nums) == nums[0]; //nums[0]是数组

// nums[0]就是一维数组的首地址,就是指向int类型的指针

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

for (int i=0; i<6; i++) {

printf("%d ",*(nums[0]+i));
}
printf("\n");

return
0;
}

// nums + i在垂直方向移动,表示指向不同的二维数组中得"一维数组"
// nums[i] + j
表示在第i行的水平方向移动,指向一个int类型的变量
// nums + i表示指向数组, *(nums + i)表示之指向这个数组的第一个元素
// *(nums + i) + j表示指向这个数组中得第j个元素
// *(*(nums + i) + j)指的是指向的变量

// 3.首先学习一个新的概念
//
指向int类型的指针,int指针,指向一个int数组的指针,数组指针(int数组二维指针)
//
数组指针是一个指向一个数组的指针(区别于指向数组元素的指针)
//
指向二维数组元素的指针
//
数组名就是一个数组指针
//
数组指针定义:
//
类型(*数组指针变量名)[长度]int (*p)[3]
//
初始化:
//
数组指针变量名 =二维数组的名字;p = nums
//
数组指针变量名 =&一维数组的名字; p = &nums[0] ? // p指向nums[0]OK

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

//
声明了一个数组指针
//
这个指针p式指向一个长度为3的int类型的数组

// nums数组
// nums[0]
// nums[1]
int (*p)[3];

p = nums;
// p指向nums[0]
// *p == nums[0]
// *(nums[0])
// **p

return
0;
}

// 4.可以尝试使用一个指向int类型的指针去访问一个二维数组
//
设立一个int类型的指针,指向二维数组的第一个元素,通过p+i进行访问
//若i起始为1,对应的行号为i/列号,对应的列号为i%列号
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: