3.4(数据结构第二节课及第二次上机中)

1.
问题1:* p++,( * p)++,*++p,++*p有什么不同?
++*和**平级,所以 * p++和( * p)++都是先 * p再++
另外两个按照顺序算

问题2:* px+1和* (px+1)区别?
因为* 的 优先级大于+,所以前一个是取值加一,后一个是下一个位置的值

2.
指针的类型与指针所指向的类型
从语法上来看,我们只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型。如:
1 int ptr; //指针的类型是 int
2 char ptr; //指针的类型是 char
3 int ** ptr; //指针的类型是 int **
4 int (ptr)[3]; //指针的类型是 int()[3]
5 int (ptr)[4]; //指针的类型是 int()[4]

从语法上来看,我们只要把指针声明语句中的指针名字和名字左边的指针声明符*去掉,剩下的就是指针所指向的类型。 如:
1 int *ptr; //指针所指向的类型是 int
2 char *ptr; //指针所指向的的类型是 char
3 int *ptr; //指针所指向的的类型是 int
4 int (*ptr)[3]; //指针所指向的的类型是 int()[3]
5 int *(ptr)[4]; //指针所指向的的类型是 int()[4]

3. 结构知识
" . " 和" -> "这两个操作符的区别:
点操作符用于普通对象引用其成员变量和函数,
->操作符是指针型对象引用其成员变量和函数。

4.
题目:用一个二维方阵(最小为3X3,最大为50X50)表示一片海域。方阵中的元素只由0和1组成。1表示海岸线。计算由海岸线围起来的小岛面积(即:由1围起来的区域中0的个数)。如下图所示8X8方阵表示的小岛面积为9:
0 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0
0 0 0 1 0 1 0 0
0 0 1 0 0 0 1 0
0 1 0 0 0 1 0 0
0 1 0 1 0 1 0 0
0 1 1 0 1 0 0 0
0 0 0 0 0 0 0 0
上述方阵表示的海域满足下面两个要求:
1、小岛只有一个。
2、用1表示的海岸线是封闭的,但有可能是凸的,也有可能是凹的。
【输入形式】先从标准输入中输入方阵的阶数,然后从下一行开始输入方阵的元素(只会0或1)。
【输出形式】在标准输出上输出用整数表示的小岛面积。

【思路】
对于方阵中的任意一个元素0,如果其位于同一行上的两个1之间,并且位于同一列上的两个1之间,则该元素在1围起来的区域中

【代码】

#include<stdio.h>
int main()
{
	int a[50][50]={0}, i,j,k,c,n,area=0;
	scanf("%d",&n);
	for(i=0;i<n;i++)
		for(j=0;j<n;j++)
			scanf("%d",&a[i][j]);
	for(i=0;i<n;i++)
		for(j=0;j<n;j++) {
		c=0;
		if(a[i][j]==0) {
			for(k=i;k<n;k++)
				if(a[k][j]==1) {
					c++; break;
				}
			for(k=i;k>=0;k--)
				if(a[k][j]==1) {
					c++; break;
				}
			for(k=j;k<n;k++)
				if(a[i][k]==1) {
					c++; break;
				}
			for(k=j;k>=0;k--)
				if(a[i][k]==1) {
					c++; break;
				}
			}
			if(c==4)
				area++;
		}
	printf("%d",area);
	return 0;
}

5.
在这里插入图片描述

6.
使用任何指针变量之前必须先给它赋一个所指合法具体对象的地址值。

7. 指针运算

  • 1指针和整型量可以进行加减。
    若p为指针,则p+n和p-n是合法的,同样p++也是合法的,它们的结果同指针所指对象类型相关。如果p是指向数组某一元素的指针,则p+1及p++为数组下一元素的指针。

  • 2当P1,和P2指向同一类型时,可以进行赋值。
    如:py = px,则px,py指向同一对象。(注意:与strcpy(py, px)的不同。)

  • 3两个指向同一类型的指针,可进行= = , > , <等关系运算,其实就是地址的比较。

  • 4两个指向同一数组成员的指针可进行相减,其结果为两指针间相差元素的个数。
    但两指针不能相加。

8.
实现字符串拷贝的函数:

void str_copy(char s[ ], char t[ ])
{
	int i = 0;
	while((s[i] =t[i] )!= ‘\0’) i++;
}

错误案例:

void str_copy(char s[], char t[])
{
	int i = 0;
	while(t[i] != ‘\0’){
		s[i] = t[i];
		i++;
	}
}

原因:结尾的’\0’没有拷贝

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值