INT **点について、として説明:
intは* pはint型の値が格納されるPによって指し示さアドレスを示すポインタによって表されます。INT ** pはint型のポインタへのポインタを格納されているPによって指し示さアドレスを示す2つのポインタを表します。
変数のポインタアドレスを格納し、値が変数の内容を指摘しました。
INT * P = {1,2,3}、P =配列内の最初のアドレス、最初の配列値* P =。
二つのポインタアドレス格納ポインタ、ポインタが指します。
* P = {1,2,3} INT、
INT ** PP =&P、
アレイのPP =第1のアドレスポインタp、* PP =最初のアドレス、アレイ** PP = 1つの最初の値。
ポインタのアレイに配列名が対応するパラメータのポインタに、すなわち二つのポインタを渡すために、ポインタの1次元配列の配列へのポインタに対応した転送パラメータの配列名二次元アレイ
二つのポインタとからなる2桁のグループ間の差:
パラメータ値にポインタがで引数によって指されたアドレスに変更することができます。引数には、アドレスポインタのポイントを変更することはできません。これは、2つのポインタの手段でのみ必要です。
実用的な操作:
関数呼び出しダブルANS = largestTriangleArea(ポイント)、
関数定義largestTriangleAreaダブル(INTポイント**){}
1:。
int points[][2]={{0,0},{0,1},{1,0},{0,2},{2,0}};//传参报错cannot convert parameter 1 from 'int [5][2]' to 'int ** '
int *points[][2]={{0,0},{0,1},{1,0},{0,2},{2,0}};//cannot convert from 'const int' to 'int *'
//指针数组里面存了数不是指针
私たちは、二次元のサイズを与えられなければならない
2:
int points1[][2]= {{0,0},{0,1},{1,0},{0,2},{2,0}};
int **points=&points1;//报错cannot convert from 'int (*)[5][2]' to 'int ** '
int **points=points1;//cannot convert from 'int [5][2]' to 'int ** '
二次元アレイは、直接使用することができない、ポインタの2次元配列を含む:
二次元(ポインタ点の二次元アレイ)のアレイにC言語ポインタ詳細
それは、INT *(P [4])として理解されるべき裸書き込みINT *はP [4] *場合よりも高い優先度()は、追加しなければならない[]、pは、ポインタ配列となりますない二次元アレイ・ポインタ
C言語のポインタのアレイ(各アレイ要素がポインタである)説明
注サンプル
レビュー:
int points1[5][2]= {{0,0},{0,1},{1,0},{0,2},{2,0}};
int *points2[5]={points1[0],points1[1],points1[2],points1[3],points1[4]};
//可以用sizeof(points1[0])/sizeof(points1[0][0])写成遍历得到所有地址
int **points=points2;//通过
int *points[5]={points1[0],points1[1],points1[2],points1[3],points1[4]};
//也通过
唯一のトラバースへのポインタの配列
3:
int p1[]={0,0}; int p2[]={0,1}; int p3[]={1,0}; int p4[]={0,2}; int p5[]={2,0};
int points1[]={p1,p2,p3,p4,p5};//cannot convert from 'int [2]' to 'int'
int **points=&points1;//cannot convert from 'int (*)[1]' to 'int ** '
アレイを定義する、アレイは、int型の数内の値でなければならない位置に割り当てることはできません
4。
int p1[]={0,0}; int p2[]={0,1}; int p3[]={1,0}; int p4[]={0,2}; int p5[]={2,0};
int* points1[]={&p1,&p2,&p3,&p4,&p5};//cannot convert from 'int (*)[2]' to 'int *'
{}、{0,0}、P1アドレスの使用は、このアレイは、必要&追加全く存在していない
配列はポイント5つのアドレスに位置するのアドレスは、直接2つのポインタに割り当てられ、このアドレス
5:
int p1[]={0,0}; int p2[]={0,1}; int p3[]={1,0}; int p4[]={0,2}; int p5[]={2,0};
int *points1[]={p1,p2,p3,p4,p5};
int **points=*points1;//cannot convert from 'int *' to 'int ** '
int **points=points1;//通过
int **points=&points1;//cannot convert from 'int *(*)[5]' to 'int ** '
6:
int p1[]={0,0}; int p2[]={0,1}; int p3[]={1,0}; int p4[]={0,2}; int p5[]={2,0};
int * points[]={p1,p2,p3,p4,p5};
//通过
int型の内側6のgetの5つの**ポイント=ポイント、原因になりませんか?
パラメータ、すなわちポインタの一次元配列の配列へのポインタに対応した転送パラメータのポインタには、2つのポインタ、配列名二次元配列を渡すポインタのアレイに配列名が対応します。*点対応する参照アドレス転送アドレスへのポインタの配列、即ち二つのポインタ、直接パラメータ渡しています。
完成
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
double largestTriangleArea(int** points, int pointsSize, int* pointsColSize){
double ans=0;
double a=0;
double b=0;
double c=0;
double p=0;
double ans1=0;
for(int i=0;i<pointsSize-1;i++)
for(int j=i+1;j<pointsSize;j++)
for(int k=0;k<pointsSize;k++)
{
if(k!=i&&k!=j)
{
a=sqrt((points[i][0]-points[j][0])*(points[i][0]-points[j][0])+(points[i][1]-points[j][1])*(points[i][1]-points[j][1]));
b=sqrt((points[i][0]-points[k][0])*(points[i][0]-points[k][0])+(points[i][1]-points[k][1])*(points[i][1]-points[k][1]));
c=sqrt((points[k][0]-points[j][0])*(points[k][0]-points[j][0])+(points[k][1]-points[j][1])*(points[k][1]-points[j][1]));
p=(a+b+c)/2;
ans1=sqrt(p*(p-a)*(p-b)*(p-c));
if(ans1>ans)
ans=ans1;
}
}
return ans;
}
void main()
{
// int *ans=(int *)malloc(sizeof(int)*(right-left+1));
int p1[]={0,0};
int p2[]={0,1};
int p3[]={1,0};
int p4[]={0,2};
int p5[]={2,0};
int *points[]={p1,p2,p3,p4,p5};
int pointsSize=sizeof(points)/sizeof(points[0]);
int pointsColSize[]={sizeof(p1)/sizeof(p1[0])};
double ans=largestTriangleArea(points, pointsSize, pointsColSize);
printf("%f\n", ans);
printf("%d\n", pointsSize);
printf("%d\n", pointsColSize[0]);
// for(int i=0;i<k;i++)
//printf("%d\n", ans[i]);
//if(ans) printf("true\n"); else printf("false\n");
}
``