黑马程序员-----------C语言基础-----------指针(二)

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------


一:数组指针的概念及定义
1.数组指针:指针变量可以指向数组元素(把某一个元素的地址放到一个指针变量中);可以用一个指针变量指向一个数组元素。
注意:
1)数组名a不代表整个数组,只代表数组首元素的地址。

二:数组指针的初始化和使用方法
1.使用指针引用数组元素   int *p,a[];
*(p++)等同于*p++,因为*和++的优先级都是第二级,同是第二级从右往左运算。
p+1和a+1效果相同。
2.使用数组指针的使用数组名的区别:
p是一个指针变量,既然是一个变量,它存放的值是可以改变的,故可以p++
a是一个常量,常量的值不可以改变,故不可以a++
总结:引用一个数组元素,可用下面两种方法:
1)下标法。如a[i]形式
2)指针法,如*(a+i)或*(p+i)
3)a是常量(a++错误),p是变量(p++正确)
三:逆序数组
用指针将数组a中n个整数按相反顺序存放
代码实现:
#include <stdio.h>
	
void Lixu(int a[],int len)
{	int temp,*p=a,j=len-1;
	for(int i=0;i<j;i++){
		temp=*(p+i);
		*(p+i) = *(p+j);
		*(p+j) = temp;
		j--;
	}
}
int main(){
//定义变量
	int a[]={1,2,3,4,5,6,7,8,9,10};


//逆序存放数组
	Lixu(a,10);
//遍历数组
	for(int i=0;i<10;i++){
	printf("%d\t",a[i]);


	}
	return 0;
	}



四:一维指针数组
1.一个数组的元素值为指针则是指针数组,指针数组是一组有序的指针的集合。指针数组的所有元素都必须是具有相同存储类型和指向相同数据类型的指针变量
2.指针数组的一般形式:
类型说明符 *数组名[数组长度]

五:指针变量的运算
1.两个指针变量减法运算
1)两个指针变量相减所得之差是两个指针所指数组元素之间相差的元素个数。
  实际上是两个指针值(地址)相减之差再除以该数组元素的类型长度
2)常见用法:两个指针都指向同一个数组
i)判断两个指针变量指向的元素是否连续
ii)判断两个指针变量之间相隔几个元素
注意:两个指针变量没有加法运算

六:用数组名访问二维数组
1.行指针和列指针:

2.等量代换:


3.数组名遍历二维数组
for(int =0;i<3;i++){
for(int j=0;j<4;j++){
printf("%d\t",*(a[i]+j)); //也可以用 *(*(a+i)+j)遍历
}
printf("\n");
}


七:二维数组指针
1.一般形式:
数据类型 (*指针变量名)[二维数组列数];
例:int a[3][4];
   int (*p)[4]; //定义一个数组指针,指向含4个元素的一维数组
   p = a; //将该二维数组的首地址赋给p,也就是a[0]或&a[0][0]
   p++; //该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][]
注意:数组指针也称指向一维数组的指针,亦称行指针


八:指针数组和二维数组指针的区别
int *p[3]={&a,&b.&c}; p是一个指针数组
int (*p)[3]; p是二维数组指针
区别分析:

九:推箱子游戏
1.思路分析
1)定义地图
char map[kRows][kCols]={
"##########",
"#O ####  #",
"# X####  #",
"#        #",
"######   #",
"#  ####  #",
"#        #",
"#   ######",
"#         ",
"##########"
};
2)坐标定义:(y,x)
3)实现游戏的几个重点:

2.代码实现
#include <stdio.h>
	#define kRows 11
	#define kCols 11
//重绘地图
void printMap(char map[kRows][kCols]){
	int i;
	for(i=0;i<kRows;i++){	


		printf("%s\n",map[i]);
	 }
}


//移动的函数
void move1(char map[kRows][kCols],int oldX,int oldY,int newX,int newY){
	char temp;
	temp = map[oldX][oldY];
	map[oldX][oldY] = map[newX][newY];
	map[newX][newY] = temp;
	}


	int main(){
	//定义变量,保存地图,位置信息
		//定义地图
		char map[kRows][kCols]={	
			"##########",
			"#O ####  #",
			"# X####  #",
			"#        #",
			"######   #",
			"#  ####  #",
			"#        #",
			"#   ######",
			"#         ",
			"##########"
			};
		//定义变量保存位置信息
		int personX = 1;
		int personY = 1;		//定义小人当前位置信息
		int personNextX = personX;
		int personNextY = personY;		//定义小人将要移动得到下一个位置信息
		//箱子当前位置
		int boxX = 2;
		int boxY = 2;
		//接收用户输入的方向
		char direction;
		char street = ' ';
		char box = 'X';
	//打印地图
	printMap(map);
	//提示玩法
	printf("q请控制小人移动:W.上 S.下 A.左 D.右 Q.退出\n");
	//编写循环控制程序
	while(1){
		//接收用户输入的方向
		scanf("%c",&direction); 
		getchar();	//从键盘上获取一个字符


		//防穿墙
		//personNextX = personX;
		//personNextY = personY;
		//判断方向
			switch(direction){	
				case 'w':
				case 'W':
					personNextX--;
					break;


				case 's':
				case 'S':
					personNextX++;
					break;


				case 'a':
				case 'A':
					personNextY--;
					break;


				case 'd':
				case 'D':
					personNextY++;
					break;


				case 'q':
				case 'Q':
					printf("程序正在退出....\n");
					printf("程序以及退出!\n");
					return 0;
				default:
					break;
		}
		//根据用户输入的方向  判断如何移动
		//判断模块
			//先判断小人下一个位置是否是路
				//如果是路,先让小人移动
			if(map[personNextX][personNextY] == street){	
				//移动
				//让小人和路交换
				move1(map,personX,personY,personNextX,personNextY);


				//重新调整小人当前的位置
				personX = personNextX;
				personY = personNextY;
			}else if(map[personNextX][personNextY] == box){		如果不是路
					//再次判断是否是箱子
				
					// 如果是箱子,计算箱子的下一个位置
					int boxNextX = boxX + (boxX - personX);
					int boxNextY = boxY + (boxY - personY);
					//再次判断箱子的下一个位置是否是路
					if(map[boxNextX][boxNextY] == street){
					//如果箱子的下一个位置是路,要移动小人和箱子
					//如何移动小人和箱子
						//移动箱子到箱子的下一个位置
						move1(map,boxX,boxY,boxNextX,boxNextY);
						//让小人移动到原来箱子的位置
						move1(map,personX,personY,boxX,boxY);
						//重新调整箱子  小人的当前位置
						personX = personNextX;
						personY = personNextY;


						boxX = boxNextX;
						boxY = boxNextY;						
					}
					
					} else {personNextX = personX;
						personNextY = personY;}
	//重绘地图
	printMap(map);
	//判断箱子是否被推出
		//箱子的当前位置是9
		if(boxY == kCols-2){
		printf("恭喜你,你推出来了");
		break;
		}
	
	}
	return 0;
}


十:字符串指针介绍及使用
1.字符串指针
在C语言中,可以用两种方法访问一个字符串
1)字符数组
2)字符串指针指向字符串
char *变量名="字符串的内容";   //“字符串内容”是常量
注意:字符串指针变量的定义说明与指向字符变量的指针变量说明是相同的。只能按对指针变量的赋值不同来区别。对于指向字符 变量的指针变量应赋予该字符变量的地址
如:
char c,*p = &c; //指向字符变量的指针变量
char *p = "abc" //字符串指针变量
2.字符串指针定义和初始化
1)定义的同时初始化
char *p = "C language";
2)先定义后初始化
char *p;
p = "C language";
注意:

3.妙用字符串指针:


4.下面写法是错的:
char *p=NULL;
scanf("%s",p);
可修改为1):
先加上头文件:#include <stdlib.h>
char *p=NULL;
p = malloc(100); //这句话作用是先申请了100个字节的内存给了p
scanf("%s",p);
也可修改为2):
char ch[100];
char *p = ch;
scanf("%s",p);


十一:二维字符数组:


十二:cha型的指针数组和字符数组的区别
1.char类型的指针数组
char *p[]={"hello","world"};


2.字符串指针和字符数组的区别
字符串指针: char *p = "abc"; //存储在常量区,指向可变,常量值不可变
字符数组:   char s1[] = "abc";  //存储在内存栈,栈内容可改变
3.字符串指针是一个变量,字符数组名是一个常量


十三:字符串排序
要求:输入五个国家的名称按字母升序排序后输出
char *name[] = {"CHINA","AMERICA","AUSTRALIA","FRANCE","GERMAN"};

代码实现:
#include <stdio.h>
#include <string.h>
//实现字符串排序
void sortString(char *arr[],int len){	
	char *temp;
	int i,j;
	for(i=0;i<len-1;i++){	


		for(j=0;j<len-i-1;j++){	
			if(strcmp(arr[j],arr[j+1])>0){	
				temp = arr[j];
				arr[j] = arr[j+1];
				arr[j+1]= temp;
				}	
			}


		}
	} 


int main(){
	 char *name[] = {"CHINA","AMERICA","AUSTRALIA","FRANCE","GERMAN"};
		int i;
	for(i=0;i<5;i++){	
		printf("%s\n",name[i]);	
		}
	//给字符串排序
	sortString(name,5);
	printf("\n");
	for(i=0;i<5;i++){	
		printf("%s\n",name[i]);	
		}
	return 0;
	}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值