2021年07月12日 笔记

指针

内存以字节编址,32位系统,内存地址编址有32个bit表示。

int m=20;
变量m占据4个字节。

C语言中

1
2
3
4
// 定义一个指针变量
int *p;
// 把变量m的地址放到指针遍历p中
p=&m;

指针变量p只会记录数据的首地址,因为地址的长度都是一样的,所以指针的大小都是一样的。

1
2
int a;
a=*p+10

*p表示到指针变量p取值,int占用4个字节,所以*p连续取出4个字节。

1
p++

等价于

1
p=p+1*sizeof(int)

把int类型的m的地址赋值给char类型的指针是否可以?

1
2
char *t;
t=&m;

可以,但取值的时候会出错。

强制类型转换

1
2
char *t;
t=(char*)&m;

强制吧m的地址赋值给char变量t。

1
2
int m=30
char k='A';

k赋值给m是否有问题?

1
m=k;

没问题。
m赋值给k有没有问题?

1
k=m;

有问题。

二维数组

C语言写法

1
int a[3][4];

内存条没有二维的,所以,二维数组得转换为一维的来存储。

行序优先存储

Java二维数组写法1

1
2
3
4
//还没有分配空间。
int a[][];
// 分配连续的空间
a=new int[3][4];

后续使用
a[0][1]

另一种二维数组的写法

1
2
3
4
int[][] a=new[3][];
a[0]=new int[2];
a[1]=new int[3];
a[2]=new int[4];

此时分配的空间就不连续了。

问:java中二维数组数组的空间是不是都是连续的
答,不一定。

a.length表示的是行的数目
a[0].length表示第一行的列数

初始化

静态初始化

1
int a[][]={{1,2,3},{4,5},{7}};

静态初始化只能在声明是使用,不能先声明再初始化。
也就是如下写法是错误的:

1
2
int a[][];
a[][]={{1,2,3},{4,5},{7}};

编程题 从键盘接收10个数,存储为2*5的矩阵,并打印出来

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class InputMatrix {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int[][] array=new int[2][5];
System.out.println("请输入10个数");
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[i].length; j++) {
array[i][j]=scanner.nextInt();
}
}

for (int i = 0; i < array.length; i++) {
System.out.print("|");
for (int j = 0; j < array[i].length; j++) {
System.out.printf("%2s",array[i][j]);
if(j<array[i].length-1) {
System.out.print(",");
}
}
System.out.print("|");
System.out.println();
}
}
}

编程题 找鞍点

二维数组中的一个元素,该元素在当前行中是最大的,但是在该元素所在的列是最小的。
例如,在如下的二维数组中:

1
2
3
1 2 3
4 5 6
7 8 9

3就是鞍点。
查找二维数组的鞍点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class SaddlePoint {
public static void main(String[] args) {
int[][] a = { { 1, 3, 2 }, { 4, 5, 6 }, { 7, 8, 9 } };
int maxInRow, minInCol;
for (int i = 0; i < a.length; i++) {
maxInRow = 0;
for (int j = 1; j < a[i].length; j++) {
// 如果在该行中有更大的值
if (a[i][j] > a[i][maxInRow]) {
// 则记下更大的值得下标
maxInRow = j;
}
}
// 遍历当前行最大的元素所在的列。
int k;
for (k = 0; k < a.length; k++) {
// 如果该列中有更小的值
if (a[k][maxInRow] < a[i][maxInRow]) {
// 当前行中最大的值在其所在的列中不是最小的
break;
}
}
// 如果找到最后,没有找到更小的值,则说明a[i][maxInRow]是该列中最小的,此时k等于列的长度
if (k == a.length) {
System.out.print("鞍点:a[" + i + "][" + maxInRow + "]=" + a[i][maxInRow]);
}
}
}
}

编程题 输出杨辉三角

1
2
3
4
5
6
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
......

编译

  编译javac                        java解释给JVM   

Java———->中间码(字节码).class——————->平台1 的JVM 来执行
|
|———————->平台2 的JVM 来执行

C语言
简化的main方法

1
2
3
4
5
6
int main(){

}
void main(){

}

完整的main

1
2
3
int main(int argsnum,char[][] args){

}

环境变量

做什么用,

例如你在命令行cmd中输入一个copy,cmd如何知道copy命令的可执行文件在字在哪里呢?
先在当前目录下查找copy的执行性文件
如果没有找到则到系统文件中取查找可执行性文件
如果系统中也没有该命令,则到系统中的PATH环境变量中记录的地址中取查找该命令的可执行性文件
如果PATH中的记录的地址也没有找到,则报错,说明找不到该可执行性文件。