?
指针数组的理解: 指针数组顾名思义是指针组成的数组, 组成元素是指针变量。
字符串初始化指针数组:
#include<stdio.h>
int main(void) {
char *a[3] = { "hello", "world", "good" }; // 定义指针数组a[],并对其初始化,把字符串的首地址赋给它.
char **p;
p = a;
for (int i = 0; i < 3; i++) {
printf("*p: %%d = %d\n", *p); //这个输出的是各字符串的首地址.
printf("*p: %%s = %s\n", *p);
printf("**p: %%d = %d\n", **p); //输出各字符串首各字母h w g的 ascii码值
printf("**p: %%c = %c\n", **p); //输出各字符串首字母
printf("*p++: %%s = %s\n", *p++); //输出字符串,%s --给它字符串的首地址就好了!
printf("------------\n");
}
return 0;
}
运行:
*p: %d = 8944628
*p: %s = hello
**p: %d = 104
**p: %c = h
*p++: %s = hello
------------
*p: %d = 8944432
*p: %s = world
**p: %d = 119
**p: %c = w
*p++: %s = world
------------
*p: %d = 8944460
*p: %s = good
**p: %d = 103
**p: %c = g
*p++: %s = good
------------
指针数组的初始化可以分开写:
char *a[3];
a[0] = "Hello";
a[1] = "World";
a[2] = "Good";
int 型数组:
#include
int main(void) {
int a[3] = { 1, 2, 3 };
int **p;
int *m[3];
for (int i = 0; i < 3; i++) {
m[i] = &a[i];
p = &m[i];
printf("m[%d] = %d\n", i, **p);
}
return 0;
}
运行:
m[0] = 1
m[1] = 2
m[2] = 3
请按任意键继续. . .
顺便测试下二级指针。
代码不能写成这样子:
int *a[3] = { 1, 2, 3 };
这样是错误的,指针变量 a 应该赋值地址给它,这样是一个 int 常量,错误!
数组指针就是指向数组的指针咯!
#include
using namespace std;
int main(void) {
int *p;
int a[3] = { 3, 2, 1 };
p = a;
for (int i = 0; i < 3; i++) {
cout << ‘a‘ << ‘[‘ << i << "] = " << *(p + i) << endl;
}
return 0;
}
运行:
a[0] = 3
a[1] = 2
a[2] = 1
请按任意键继续. . .
m 个元素组成的一维数组的指针变量——int (*p)[m]
的理解:
#include
int main() {
int a[6] = { 0, 1, 2, 3, 4, 5 };
int(*pt)[6] ;
pt = &a; // 相当于含一个一维数组的二维数组,这里必须加取地址符 &,
// 可以直接写成: int (*pt)[6] = &a; // 不能写成 int (*pt)[6] = a;
printf("**pt = %d\n", **pt);
printf("*(*pt + 1) = %d\n", *(*pt + 1));
printf("*(*pt + 2) = %d\n", *(*pt + 2));
/* ... */
return 0;
}
运行:
**pt = 0
*(*pt + 1) = 1
*(*pt + 2) = 2
请按任意键继续. . .
其实是可以这样理解的:一对[]
等价于一个*
;所以,int(*pt)[6]
可以理解为双重指针,它只能指向含有 6 个元素 (int) 的一位数组,上例改为int (*pt)[8] = &a // 或者不是 8 的其他数字
。就会出错。
#include
int main() {
int a[3][4] = { { 1, 2, 3, 4 },
{ 5, 6, 7, 8 },
{ 9, 10, 11, 12 }
};
int(*p)[4], i, j;
p = a;
printf("请输入你想要输出元素的行和列:");
scanf_s("%d,%d", &i, &j);
printf("a[%d][%d]=%d\n", i, j, *(*(p + i) + j));
// 从第 0 行开始输出a[i][j].
return 0;
}
``
请输入你想要输出元素的行和列:1,2
a[1][2] = 7
请按任意键继续. . .
这里用二维数组就比较好理解了,指向含有 4 个元素的一维数组。
note: 指针变量就是用来放地址的,指针变量存放的值就是地址。宏观讲,指针就是地址地址就是指针。
?
?
原文:https://www.cnblogs.com/huvjie/p/14928638.html