① c语言中指针*p中的p和数组a[10]中的a有什么区别…在用法上和意义上…求答案
二重指针,首先你要有数组的概念,数组就是一片连续的存储地址,一维的情形用一个指针来实现对数组中数据的引用。如 int a[10];这句话实际是在内存中申请了10个连续的地址块,每块地址可以用来存储一个int型数据。而a就是用来引用数据的指针,比如a[2],实际就引用了第三块地址(从0开始)。 而二维数组和一维的原理是一样的也是连续的地址块,只是引用的方式不一样,术语上讲就是二重指针;int a[3][3],开辟了9个int的连续地址,a不能直接引用其中的某一块a,你可以把它看做是矩阵,a[0]是指向第一行,第一行可以看做数组,那么a[0]就是一维数组的指针,a[0][1]就表示第一行那个一维数组中的第二个元素;类似a[1][2]就表示第二行那个一维数组中的第三个元素。 这块内容要画出内存图就能更好的理解了,你自己试着画一画。其实很简单不管是几维的数组他们的物理存储都是连续的一块内存,只是解释方式不同而已。重要的不是他们的实际的物理存储,而是他们的逻辑结构(在程序中你要怎么去解释)
② 怎么理解C语言二重指针的这几个输出刚学指针有点懵逼QAQ
int *是指针变量,int**是指向指针的变量
指针变量,也是变量,本身也有地址,只不过这个变量里面放的是地址。
所以这里p1指向变量x(变量x里存放的值是23,变量p1里存放的是x的地址).
---直接写p1,就表示取p1这个变量的值(也就是x的地址)。
---写*p1,就是取变量p1所存放的那个地址对应的值。
同理p2是指向指针的变量,顾名思义,p2指向变量p1。
---直接写p2,就是表示取变量p1的地址。
---写*p2就是取p2所存放的地址对应的值(也就是p1的值,也就是x的地址)。
---写**p2,你可以看成*(*p2),那么就等同于*p1,取的是x里存放的值23。
③ C语言中char**是什么意思 和char*有什么区别呀
意思:char ** 指向字符型指针的指针;
区别:
char *字符型指针,指向一个字符;
数据在内存中的存储区域
1、栈:就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。
2、堆:就是那些由new或malloc分配的内存块,在不适用时,要手动用delete或free来释放内存区域。
3、全局/静态存储区:全局变量和静态变量被分配到同一块内存中,他们共同占用同一块内存区。
4、常量存储区:这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改
char**最常使用在main函数中:
int main(int argc,char**argv);
等同于int main(int argc,char*argv[])
等同于int main(int argc,string argv)(C语言中并不直接包含字符串类型,此处便于理解,所以使用string类型)
char是字符变量的说明符
字符变量的取值是字符常量,即单个字符。字符变量的类型说明符是char。字符变量类型说明的格式和书写规则都与整型变量相同。
(3)c语言二重指针扩展阅读:
字段类型
在MYSQL中,字段类型char是指:使用指定长度的固定长度表示的字符串;比如char(8),则数据库会使用固定的1个字节(八位)来存储数据,不足8位的字符串在其后补空字符。
字符转换
在excel中char函数用于返回对应发于数字代码的字符。其用法:=char(number)
其中,参数number为转换的字符代码,介于0~255之间,char占一个字节,也就是8个二进制位,但它表示的是有符号的类型,所以表示的范围是-128~127;uchar表示无符号的类型,所以表示的范围是0~255。
代数概念
char是characteristic的简写,表示一个环或者域的特征,即最小的非负整数n,使ne=0。(e为单位元)。
网络——char(计算机语言关键字)
④ 请问C语言中**a[9]是什么意思呢
"**应该表示2维指针" -- 不叫二维指针,而叫二重指针,就是指针的指针。
**a[9] -- 这是一个 二重指针数组。数组有9个单元,可以指向9个 二重指针。
用它来表示一个三维数组,比较复杂,在作为三维数组使用前,须要分配它的存储单元,看下面程序。
程序第一部分,**p[9] 作为二重指针数组。第二部分,变成p[3][2][9]三维数组.
#include <stdio.h>
#include <stdlib.h>
main()
{
int a=1,b=2,c=3;
int *aa,*bb,*cc; // 指针
int **aaa,**bbb,**ccc; // 二重指针
int **p[9],i,j,k;
aa=&a; bb=&b; cc = &c; // 赋地址
aaa = &aa; bbb=&bb; ccc = &cc; // 赋地址
p[0] = aaa; p[1] = bbb; p[2] = ccc; // 赋地址
p[6] = aaa; p[7] = bbb; p[8] = ccc; // 赋地址
printf("%d %d %d\n", **p[0], **p[1], **p[2]); // 打印值
printf("%d %d %d\n\n", **p[6], **p[7], **p[8]); // 打印值
// 第二部分 分配 指针 指向的单元
for ( i=0;i<9;i++) p[i] = (int **) malloc(sizeof(int *) * 2);
for (j=0;j<2;j++) {
for ( i=0;i<9;i++){
p[j][i] = (int *) malloc(sizeof(int) * 3);
}
};
// 赋值 1,2,3,4。。。54 并打印值
for (i=0;i<3;i++) for (j=0;j<2;j++) for (k=0;k<9;k++) { p[i][j][k] = a; a++;};
for (i=0;i<3;i++) for (j=0;j<2;j++) for (k=0;k<9;k++) printf("%d\n",p[i][j][k] );
}