C语言指针相关

1.char *s[] 若执行s++,则:

2.char **s 若执行s++,则:向后一个指针的大小(一般为4个字节)

3.char (*s)[] 则s是指向一行的指针,若执行s++,则s会指向下一行

4.int **a 若执行a++,则:向后一个指针的大小(一般为4个字节)

5.int *a[] 若执行a++,则:

6.int (*a)[] 则a是指向一行的指针,若执行a++,则a会指向下一行

  • 1和2如果写在函数的形参里面,那么是等价的。
  • 4和5如果写在函数的形参里面,那么是等价的。
  • 如果1不是写成函数的形参,那么s就是一个常量,不能更改。
  • 如果2不是写成函数的形参,那么s就是一个变量,可以更改。
  • 3和6都是指向一行的指针
1
2
3
int b[105][105];
int **a = b;
//不能这样写,因为b是指向行的指针
1
2
3
int b[105][105];
int **a = &b[0];
//b[0]是常量,一般取不了

一般来说,二级指针是和指针数组相关联的int (*a)[] 这种是和二维数组相关联的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<stdio.h>

char *s[105];

void work(char **s) {
puts(*s);
s++;
puts(*s);
s++;
puts(*s);
}

int main() {
s[0] = "123";
s[1] = "abc";
s[2] = "ABC";
work(s);
return 0;
}
1
2
3
123
abc
ABC

观察这段程序,问题出在哪里?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<stdio.h>

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

void fun(int (*p)[]) {
printf("%d\n",**p);
p+=1;
printf("%d\n",**p);
}

int main() {
fun(a);
return 0;
}

问题:没有声明所指向的一行有多少个元素,改为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<stdio.h>

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

void fun(int (*p)[3]) {
printf("%d\n",**p);
p+=1;
printf("%d\n",**p);
}

int main() {
fun(a);
return 0;
}

即可。


如果声明了int *a = malloc(size);,那么之后可以用a[i]表示*(a + i)