数组指针和指针数组

int main()

{
//一维数组

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

//步长为5的数组指针,即数组里有5个元素

int (*p)[5];

//把数组a的地址赋给p,则p为数组a的地址,则*p表示数组a本身

p = &a;

//%p输出地址, %d输出十进制

//\n回车

//在C中,在几乎所有使用数组的表达式中,数组名的值是个指针常量,也就是数组第一个元素的地址,它的类型取决于数组元素的类型。

printf("%p\n", a); //输出数组名,一般用数组的首元素地址来标识一个数组,则输出数组首元素地址

printf("%p\n", p); //根据上面,p为数组a的地址,输出数组a的地址

printf("%p\n", *p); //*p表示数组a本身,一般用数组的首元素地址来标识一个数组

printf("%p\n", &a[0]); //a[0]的地址

printf("%p\n", &a[1]); //a[1]的地址

printf("%p\n", p[0]); //数组首元素的地址

printf("%d\n", **p); //p为数组a本身,即为数组a首元素地址,则(p)为值,当p为数组首元素地址时,**p表示首元素的值1

printf("%d\n", p[0]); //根据优先级,p[0] 表示首元素地址,则p[0]表示首元素本身,即首元素的值1

printf("%d\n", *p[1]); //为一个绝对值很大的负数,不表示a[1]…表示什么我还不知道

//将二维数组赋给指针

int b[3][4];

int(*pp)[4]; //定义一个数组指针,指向含4个元素的一维数组

pp = b; //将该二维数组的首地址赋给pp,也就是b[0]或&b[0],二维数组中pp=b和pp=&b[0]是等价的

pp++; //pp=pp+1,该语句执行过后pp的指向从行b[0][]变为了行b[1][],pp=&b[1]

int k;

scanf_s("%d", &k);

return 0;

}
所以数组指针也称指向一维数组的指针,亦称行指针。

指针数组:
int main()
{

int a = 1;
int b = 2;
int *p[2];
p[0] = &a;
p[1] = &b;

printf("%p\n", p[0]); //a的地址

printf("%p\n", &a); //a的地址

printf("%p\n", p[1]); //b的地址

printf("%p\n", &b); //b的地址

printf("%d\n", p[0]); //p[0]表示a的地址,则p[0]表示a的值

printf("%d\n", p[1]); //p[1]表示b的地址,则p[1]表示b的值

//将二维数组赋给指针数组

int *pp[3]; //一个一维数组内存放着三个指针变量,分别是p[0]、p[1]、p[2],所以要分别赋值

int c[3][4];

for (int i = 0; i<3; i++)

pp[i] = c[i];

int k;

scanf_s("%d", &k);

return 0;

}
还需要说明的一点就是,同时用来指向二维数组时,其引用和用数组名引用都是一样的。
比如要表示数组中i行j列一个元素:

(p[i]+j)
((p+i)+j)
(
(p+i))[j]、p[i][j]
优先级:()>[]>
*

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在这段代码中,有几个问题: 1. `sizeof` 是求类型或变量的大小,而不是求数组的长度。所以在这里 `sizeof(p)` 的结果永远都是 `sizeof(Point)`,而不是数组的长度。应该使用 `sizeof(p) / sizeof(p[0])` 来求得数组的长度。 2. `finalP` 数组的类型应该是 `P` 类型的,而不是 `int` 类型的数组。 3. 在判断 `flag[i] = 1` 的时候应该使用双等号 `==` 而不是单等号 `=`。 4. `hull` 函数中并没有完整的求凸包的算法实现,需要补充完整代码。 下面是修正后的代码: ```c++ #include<iostream> using namespace std; typedef struct Point { int x, y; }P; P points[100]; int flag[100] = { 0 }; // 排列算法 bool sortP(P p1, P p2) { if (p1.x == p2.x) return p1.y > p2.y; else return p1.x > p2.x; } int S(P p1, P p2, P p) { return 0.5 * ((p1.x * p2.y - p2.x * p1.y) + (p2.x * p.y - p.x * p2.y) + (p.x * p1.y - p1.x * p.y)); } P hull(P p, int mode) { int n = sizeof(p) / sizeof(p[0]); P finalP[100]; // 找到最左下角的点作为起点 int start = 0; for (int i = 1; i < n; i++) { if (sortP(points[i], points[start])) { start = i; } } // 按照顺时针方向扫描所有点 int k = 0; int cur = start; do { flag[cur] = 1; finalP[k++] = points[cur]; int next = -1; for (int i = 0; i < n; i++) { if (i != cur && flag[i] == 0) { if (next == -1) { next = i; } else { int s = S(points[cur], points[next], points[i]); if (s < 0 || (s == 0 && mode == 1 && sortP(points[i], points[next]))) { next = i; } } } } cur = next; } while (cur != start); // 返回 finalP 数组 return finalP; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值