数组与指针匹配:
a)一级数组配一级指针:
int a[20];
int* p = a;
b)二维数组配行指针:
int as[3][20];
c)指针数组配二级指针:
int* ps[20];
二维数组本质上是以一维数组作为数组元素的数组,即“数组的数组”,
类型说明符 数组名[常量表达式][常量表达式]。
1、任何指针变量能访问两种对象(变量和数组)
数组不用取地址,变量要取地址
a)一级指针:
int n;
int* p = &n;
int a[20];
p=a;
b)行指针指向一个一维数组的地址(取地址)
或者是指向一个二维数组(不用取地址):
double a[12];
double (*p)[12] = &a;//double [12]*
double as[5][12];
p = as;
c)二级指针指向一级指针变量(取地址):
或者指向一级指针的数组(不用取地址)
double* p=NULL;
double * *pp = &p;
double *ps[20]={NULL};
pp=ps;
我个人一直在纠正一个问题就是地址的地址是错误
int n;
&&n;错误
2、二级指针:是一级指针变量取地址。(正确)
a)二级指针做形参,遥控一个一级指针变量的实参
b)二级指针做形参,遥控一个指针数组的实参
做个DOS参数的软件,通过main函数的参数把传入的整数全部相加(加法计算器)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string>
int main(int argc, char** argv) {
printf("总共有argc = [%d]条指针\n", argc);
int sum = 0;
char buf[][50] = { 0 };
char(*p)[50] = buf;
char str[100] = { 0 };
for (int i = 0; i < argc; i++)
{
if (!i) continue;
strcpy(p[i], argv[i]);
sum += atoi(argv[i]);
if (i <= argc - 1) {
int n = strlen(p[i]);
p[i][n] = ' + ';
p[i][n + 1] = '\0';
}
printf("%s", p[i]);
if (i < argc - 1)
printf("+ ");
else printf("= ");
}
printf("%d\n", sum);
return 0;
}