69,382
社区成员
发帖
与我相关
我的任务
分享
void output(char **buffer){
printf(“%s\n”,buffer[0]);
// output::buffer == ((char**) (main::buffer);
// output::buffer[0] == ((char**) (&main::buffer ))[0];
//
// 这是把 main::buffer 当作储存指针的数组使用,
// output::buffer[0]是该指针数组的第一个元素
// 该指针其实是把
// main::buffer[0][0],main::buffer[0][1],main::buffer[0][2],main::buffer[0][3]。。。。
// 这4(指针长度)个字符,组成的一个整型数据,当作指针使用
// 这样 output::buffer[0] 其实是个野指针。
// 出错是正常,不错是巧合。
// 这里借用一下,C++的作用域限定符:: 表示作用域
}
void main(){
char buffer[100][1024] = {0};
int len = sprintf(buffer[0],"i am a bastard...");
buffer[0][len] = '\0';
output(buffer);//传递buffer 即 &buffer[0],这里类型不对,应该报错,或者警告。
}
多级指针,需要指针数组做中转,或者动态分配数据
才能和多维数组匹配
//维持这种函数定义,需要传如指针地址,指针数组,和二级指针
void output(char **buffer){
printf(“%s\n”,buffer[0]);
}
void main(){
char buffer[100][1024] = {0};
int len = sprintf(buffer[0],"i am a bastard...");
buffer[0][len] = '\0';
/************* 1 ***************/
{ char *p[100];
int i;
for(i=0;i<100;i++)p[i] = buffer[i];
output(p);
}
/************* 1 ***************/
{ char *p[100];
char **pp = &p;
int i;
for(i=0;i<100;i++)p[i] = buffer[i];
output( pp );//
}
/*********** 3**********/
{
char **pp = malloc(sizeof(char *)*100);//c++ 替换为 char ** =new char*[100];
int i;
for(i=0;i<100;i++)pp[i] = buffer[i];
output( pp );//
free(pp); //c++ 替换为 delete[]pp;
}
}
多级指针,多维数组
数组维度,和指针的级别是不同的概念,虽然有对应关系。
指针级别,就是间接访问的次数,
数组维度,指的是数组层次,是一层套一层的概念,这个就是多维数组,递归定义的含义。
数组访问是逐层查找,
就像中央---省 ---县----镇----村--- 家-----个人
这样的查找的,不过是按照每一层次的大小(改维度的大小)数数而已。
数组每个维度,只是大块和小块的关系,整个数组是在一起的。
变量(所谓对象),和数据是直接对应的,所以是直接访问的。
指针,访问所指地址中的数据,是间接访问的。
多级指针,就是不断找到下级地址访问数据。每一级指针,只能找到下级指针。
指针分级,并不需要放在一起存储,除了一级一级找到地址,无法一次到位访问。
如果,某级指针未定义(初始化),就不能向下级访问了。
比如
int *p;//
int **pp =& p;//
可以访问 *pp ;不可以访问 *p;
因为 p ;没有初始化----定义时候,没有初始化,也没有赋值,让他指向对象(变量)的地址。
数组,已经定义,各个维度都定义好了。
即
int a[M][N];//二维数组 a 已经定义。
a[0].........a[M-1] 都是定义好的一维子数组。
a[0][1].........a[M-1][N-1]; //都是定义好的数组元素(变量)。
//在堆中开辟一个4×5的二维int数组
#include <stdio.h>
#include <malloc.h>
int **p;
int i,j;
void main() {
p=(int **)malloc(4*sizeof(int *));
if (NULL==p) return;
for (i=0;i<4;i++) {
p[i]=(int *)malloc(5*sizeof(int));
if (NULL==p[i]) return;
}
for (i=0;i<4;i++) {
for (j=0;j<5;j++) {
p[i][j]=i*5+j;
}
}
for (i=0;i<4;i++) {
for (j=0;j<5;j++) {
printf(" %2d",p[i][j]);
}
printf("\n");
}
for (i=0;i<4;i++) {
free(p[i]);
}
free(p);
}
// 0 1 2 3 4
// 5 6 7 8 9
// 10 11 12 13 14
// 15 16 17 18 19
//在堆中开辟一个3×4×5的3维int数组
#include <stdio.h>
#include <malloc.h>
int ***p;
int i,j,k;
void main() {
p=(int ***)malloc(3*sizeof(int **));
if (NULL==p) return;
for (i=0;i<3;i++) {
p[i]=(int **)malloc(4*sizeof(int *));
if (NULL==p[i]) return;
for (j=0;j<4;j++) {
p[i][j]=(int *)malloc(5*sizeof(int));
if (NULL==p[i][j]) return;
}
}
for (i=0;i<3;i++) {
for (j=0;j<4;j++) {
for (k=0;k<5;k++) {
p[i][j][k]=i*20+j*5+k;
}
}
}
for (i=0;i<3;i++) {
for (j=0;j<4;j++) {
for (k=0;k<5;k++) {
printf(" %2d",p[i][j][k]);
}
printf("\n");
}
printf("---------------\n");
}
for (i=0;i<3;i++) {
for (j=0;j<4;j++) {
free(p[i][j]);
}
free(p[i]);
}
free(p);
}
// 0 1 2 3 4
// 5 6 7 8 9
// 10 11 12 13 14
// 15 16 17 18 19
//---------------
// 20 21 22 23 24
// 25 26 27 28 29
// 30 31 32 33 34
// 35 36 37 38 39
//---------------
// 40 41 42 43 44
// 45 46 47 48 49
// 50 51 52 53 54
// 55 56 57 58 59
//---------------