Skip to content

Commit 6bd9f06

Browse files
committed
update
1 parent a585948 commit 6bd9f06

File tree

2 files changed

+56
-0
lines changed

2 files changed

+56
-0
lines changed

C入门/1.C语言简介(一).md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -534,6 +534,16 @@ for (i = 0; i < size; i++) {
534534
```
535535

536536

537+
数组的传递不可能通过拷贝的方式来传递。
538+
C语言基于效率的原因,在传递的时候,数组名仅充当数组中的首元素地址使用。
539+
数组有三个要素:
540+
- 起始地址
541+
- 步长(刻度)
542+
- 数组长度
543+
数组名是一个指针包含了(起始地址、步长),但数组名里面没有包含整个数组的长度,所以在传递一维数组的时候,要传数组名和数组的长度。
544+
545+
546+
537547
## typedef关键字
538548

539549
C语言提供了typedef关键字,可以使用它来为类型取一个别名:
@@ -651,6 +661,15 @@ char *date = "June 14";
651661
正因为有了数组和指针之间的紧密关系,才使上面这两个声明中的date都可以用作字符串。
652662
在声明为数组时,date是数组名。在声明为指针时,date是变量,这个变量可以在程序执行期间指向其他字符串。
653663
664+
665+
C语言中将常量字符串处理为一个存放到内存数据区的这段字符串的首地址。
666+
char *正好能代表了整个字符串(起始地址、步长、'\0')。
667+
668+
所以到目前为止共有三种形式的字符串:
669+
- 字符串常量: 存储于内存的rodata段,编译为指针,以`'\0'`结尾,例如"abcd"。
670+
- 字符指针: 用于指向字符串常量,但不能更改内容,例如`char *p = "abcd"`。
671+
- 字符数组: 用于存储可更改字符串的数组,例如`char str[] = "abcd"`。
672+
654673
C提供了string.h头,在<string.h>中声明的每个函数至少需要一个字符串作为实际参数。
655674
字符串形式参数声明为char *类型,这使得实际参数可以是字符数组、char *类型的变量或者字符串字面量。
656675

C入门/2.指针(二).md

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -320,6 +320,29 @@ ptr++
320320

321321
如果上面ptr指向一个地址为1000的字符,上面的运算会导致指针指向位置1001,因为下一个字符位置在1001。
322322

323+
指针的算术运算:
324+
325+
pp + 1的实质就是pp + sizeof(type)。
326+
例如:
327+
```c
328+
int *p = 0x0001;
329+
int *q = 0x0005;
330+
331+
if (pp + 1 == q) {
332+
// true
333+
}
334+
335+
if (q - p == 1) {
336+
// true
337+
}
338+
339+
340+
341+
```
342+
343+
344+
345+
323346
## 函数指针
324347

325348
函数指针是指向函数的指针变量。
@@ -424,6 +447,20 @@ int *p = &a[0];// 数组第一个元素的指针
424447

425448
因为可以用数组的名字作为指向数组第一个元素的指针。所以数组名在传递给函数时,总是被视为指针。对于形式参数而言,声明为数组跟声明为指针是一样的。但是对变量而言,声明为数组跟声明为指针是不同的。声明int a[10];会导致编译器预留10个整数的空间,但是声明int *a;只会导致编译器为一个指针变量分配空间。
426449

450+
451+
452+
##### 指向数组的指针
453+
定义方式: 类型名称(*指针名)[数组长度]
454+
455+
例如:
456+
```c
457+
int a[5] = {1, 2, 3, 4, 5}
458+
int (*p)[5] = &a;
459+
```
460+
定义的时候不能丢掉括号,因为[]优先级比*高,如果丢掉括号,会变成指针数组。
461+
462+
数组指针定义时的数组长度、元素类型必须与指向的数组给出的长度、类型相同。
463+
427464
### 递增一个指针
428465
429466

0 commit comments

Comments
 (0)