Skip to content

Commit

Permalink
linux,c笔记补充
Browse files Browse the repository at this point in the history
  • Loading branch information
whitestarrain committed Jan 17, 2024
1 parent 852eab8 commit 4d291eb
Show file tree
Hide file tree
Showing 3 changed files with 90 additions and 5 deletions.
32 changes: 31 additions & 1 deletion C/c.md
Original file line number Diff line number Diff line change
Expand Up @@ -12943,19 +12943,49 @@ void func(int a[])

#### 2.10.4.1. 常见情况

- `count int *`, `int const *`
- `count int * a`, `int const *a`
- 这两种写法是一样的
- ,`a` 是一个 **指向 `const int` 型的指针** ,
- `a` 所指向的内存单元不可改写,所以 `(*a)++` 是不允许的,
- 但 `a` 可以改写,所以 `a++` 是允许的。
- 可以理解为,`const`的是`* a`

- `int * const a`
- `a` 是一个 **指向 `int` 型的 `const` 指针** ,
- `*a` 是可以改写的,但 `a` 不允许改写。
- 可以理解为,`const`的`a`

- `int const * const a`
- `a` 是一个 **指向 `const int` 型的 `const` 指针** ,
- 因此 `*a` 和 `a` 都不允许改写。
- 可以理解为,`const`的`a`和`*a`

多级指针同理,示例:

```c
int main(int argc, char *argv[])
{
char c = 'a';
char *p1 = &c;
char **p2 = &p1;

const char **pp1 = p2;
char const **pp1_2 = p2;
// **pp1 = 'b'; // error

char *const *pp2 = p2;
// *pp2 = *pp2 + 1; // error

char **const pp3 = p2;
// pp3 = pp3; // error

char const *const *const pp4 = p2;
// const char *const *const pp4 = p2;
// pp4 = pp4; // error
// *pp4 = *pp4 + 1; // error
// **pp4 = **pp4 + 1; // error
}
```

#### 2.10.4.2. 隐式类型转换

Expand Down
52 changes: 49 additions & 3 deletions base/References/awk.md
Original file line number Diff line number Diff line change
Expand Up @@ -691,7 +691,7 @@ c

以上出现奇怪问题,`tB[“c”]`没有定义,但是循环时候,发现已经存在该键值,它的值为空,这里需要注意,awk数组是关联数组,只要通过数组引用它的key,就会自动创建改序列。

```shell
```awk
# 正确判断方法:
awk 'BEGIN{tB["a"]="a1";tB["b"]="b1";if( "c" in tB){print "ok";};for(k in tB){print k,tB[k];}}'
a a1
Expand All @@ -714,7 +714,7 @@ awk的多维数组在本质上是一维数组,更确切一点,awk在存储

类似一维数组的成员测试,多维数组可以使用`if ( (i,j) in array)`这样的语法,但是下标必须放置在圆括号中。类似一维数组的循环访问,多维数组使用`for ( item in array )`这样的语法遍历数组。与一维数组不同的是,多维数组必须使用`split()`函数来访问单独的下标分量。

```shell
```awk
awk 'BEGIN{
for(i=1;i<=9;i++){
for(j=1;j<=9;j++){
Expand All @@ -739,7 +739,7 @@ for(i=1;i<=9;i++){

另一种方法:

```shell
```awk
awk 'BEGIN{
for(i=1;i<=9;i++){
for(j=1;j<=9;j++){
Expand All @@ -752,6 +752,52 @@ for(m in tarr){
}'
```

### 注意

多维数组使用参考: [gnu awk-Arrays of Arrays](https://www.gnu.org/software/gawk/manual/html_node/Arrays-of-Arrays.html)

- 数组不需要声明,直接使用即可。比如`arr = []`这样声明会报错
- awk的多维数组在本质上是一维数组,更确切一点,awk在存储上并不支持多维数组。
- awk提供了逻辑上模拟二维数组的访问方式。
- 例如,array[2,4] = 1这样的访问是允许的。
- awk使用一个特殊的字符串SUBSEP (\034)作为分割字段,在上面的例子中,关联数组array存储的键值实际上是`2\0344`
- 因为本质上是字符串,不支持取出子数组来进行操作,比如`item = result[field1]; print(item["field2"])`会报错
- 只能多个`for .. in `
- 或者`arr[key1,key2], arr[key1][key2]`

示例:

```awk
BEGIN{
OFS=","
}
NR>1{
field1 = $1
field2 = $2
field3 = $3
field4 = $4
field5 = $5
field5 = $6
result[field1]["field2"] = field2
if(field4 == field5) {
result[field1]["creator"] = field5
}
if("owner" in result[field1]){
result[field1]["owner"] =result[field1]["owner"]","field5
}else{
result[field1]["owner"] = field5
}
}
END{
print("field1\tfield2\tcreator owner")
for(field1 in result){
# item = result[field1]; print(item["field2"]) # 这种会报错
print(field1"\t"result[field1]["field2"]"\t"result[field1]["creator"]"\t"result[field1]["owner"])
}
}
```

## 内置函数

awk内置函数,主要分以下3种类似:算数函数、字符串函数、其它一般函数、时间函数。
Expand Down
11 changes: 10 additions & 1 deletion base/linux.md
Original file line number Diff line number Diff line change
Expand Up @@ -607,7 +607,7 @@ find ./images -type f -print0 | {
- -n 指定需要多少个参数
- -I {} 指定替换字符串,这个字符串在xargs扩展时会被替换掉
- 用于待执行的命令需要多个参数时,指定xargs 参数的位置
- -P 并发执行数量,如 `echo '1 2 3 4' | xargs -n1 -t -P 10 sleep`
- -P 并发执行数量,如 `echo '1 2 3 4' | xargs -d ' ' -t -P 10 sleep`
- -0:指定0为输入定界符

> **应用示例**
Expand All @@ -630,6 +630,15 @@ find ./images -type f -print0 | {
name name name name
```
- 在xargs中调用function

```bash
my_echo(){
echo "$1"
}
export -f my_echo
echo "1 2 3 4" | xargs -d ' ' -t -P 5 -I {} bash -c "my_echo {}"
```

- 综合应用

Expand Down

0 comments on commit 4d291eb

Please sign in to comment.