c语言二级指针初始化为空后赋值问题 c语言中,指针能二次赋值咩

作者&投稿:敞蓝 (若有异议请与网页底部的电邮联系)
对指针的理解不够深刻,首先指针也是一个变量。二级指针保存着是一级指针地址的变量,所以int **ppdata = NULL说明了 这个二级指针保存的是一个一级指针的地址,保存的地址是0;由于保护模式的缘故,(可自行查阅资料),ring3无法对保护段的内存进行读写,所以会出现运行时崩溃。而第一个没报错的原因是因为一级指针虽然初始化保存了0的地址,但是代码在之后的操对一级指针进行重新赋值让其指向了别的内存段。所以没报错。

给二级指针的一级指针赋地址,之所以会出错,尽管二级指针已经置为NULL,但因为其一级指针指向是不定的,也就是说没有赋值NULL,当你给它赋值就会出现段错误。这和指针初始化要为NULL的原因是一致的

1报错的应该是标注的*ppint=pint;这行吧。正常的例子是给ppdata赋值了malloc的一个地址;错误的例子是给*pdata即 NULL赋值了malloc的一个地址。NULL是不允许赋值的。
出错的原因是ppint没有赋值有效的内存地址,他应该指向一个一级指针变量的地址,而这里指向的是null。
2先理解一下二级指针的含义(程序中的变量值的都是一个地址,不同的变量类型是地址存的内容类型不同):
int a =256;//a是一个变量,a对应的是一个保存普通变量的地址,这个地址存的值是256
int *pint = &a;//pint是一级指针,pint对应的是一个保存普通变量地址的地址,他保存的值是a的地址
int **ppint = &pint;//ppint是二级指针,ppint对应的是一个保存指针变量的地址,他保存的值是pint的地址。
ppint这个地存的是pint的地址,pint存的是a的地址,a存的是个值256;可以看到
*ppint = pint = &a //a的地址,这里的=标示等于不是c语言中的赋值
重点来了*ppint = &a,不会报错,应为*ppint 合法的地址,他就是pint。但是如果只初始int *ppint = NULL,然后 int *ppint = &a就会报错,因为*ppint =NULL指向的是一个一级指针的地址,这个地址目前是NULL,不是有效的地址,无法给他复制。
3主意正常的例子中int *ppdata=NULL;这句,ppdata名字有点迷惑人,看着是个二级指针,实际是个一级指针。
有问题的例子,做如下修改应该也是可以编过的。
oid test1(int **ppint)
{
int *pint=(int *)malloc(sizeof(int)*100);
*ppint=pint;//这里不会报错,因为他等价pdata=pint;//pdata是有效的地址。
}
int main()
{
int * pdata =NULL;
int **ppdata=&pdata;

test1(ppdata);
return 0;

}
我现在知道上面的每一行是什么意思,但是三天之后再回过头来可能我自己也看不懂了。
万恶的**p

你标注释的地方错了吧,应该是后面那行出错,不然写法一样怎么可能一个出错一个不出错

C语言 二级指针 赋值问题~

编译器不同的缘故,使用VS有在语法上有很多不一样的地方,太久没用了,具体我也忘了。但是C语言很多编译器都是不一样的,像C变量声明必须提前的,但是有些编译器你没提前也会通过。


指针变量只是存放指向存储数据的空间的地址, 它本身并不存放实际的数据
指针就像是一本书的目录, 如第五章在38页, 它只是指引你到哪里去找到第5章, 并不管第5章里面到底写的什么内容, 如果编写目录的时候错了,或者前面又加了章节, 目录就要改变, 第五章在49页, 相当于给指针赋了新值.

...*p[3],问一下为什么p[0]=a;不对呢,这里面p是二级指针
答:首先需要知道,这里的p是一个指针数组,而不是一个数组指针,p[0]是这个指针数组的第一个元素,该元素是一个一维指针,所以不能将a直接赋值给p,因为a是一个二维数组的名字。直接使用p=a也是不可以的,如果将p定义为如下形式就可以了,如int (*p)[3];这里的p就是一个数组指针了,可以直接将a...

请教C语言指针问题
答:而int **b; 假设b的地址为 0x 0000FF00,而该地址的存储的数据的持续长度为4Bytes;(32位环境)b = a; 会把 0x000000FF这个地址值赋值给以地址0x0000FF00开始的4Bytes的空间里,这里我们假设机器为32位的,所以内存地址为32位。++b 就是把存储在地址0x0000FF00这个地址的指针内容加1个单位,...

在求助,c语言函数间的二级指针传递问题有点懵55555
答:二维指针初始化分配空间分成两步操作: 先分配二维指针的行数 再分配每行的数据空间 如: int **p;int n=10;int m=100;p=(int **)malloc( n*sizeof(int *) ); //分配n行for( i=0;i

C语言 传递二级指针
答:void ChangeStrPo(char **p)改为 char** ChangeStrPo(),然后main里,ps=ChangeStrPo();说明,你原来的changestrpo,p是ps的副本,malloc后,p改变了值,但是ps并没有改变。当传递指针的时候,可以通过*ps来改变指针所值的地址内存放的值,但是是改变不了实参ps本身的值。

c 语言二级指针 char **a={"88","99","00"}这样子初始化怎么输出字符...
答:首先不能这么初始化,二维数组或指针必须至少给出其中一个维度。另一个才可以根据初始化内容自动确定。然后字符串最后得有'\0'。要输出的话puts(*(a+i))或puts(a[i])

C语言指针与二维数组求解
答:也就是说此处并不是定义数组,而只是个指针,而这个指针指向的变量不是普通的char,而是一个有三个元素的数组。你可以试试看sizeof(p)的值是多少,结果应该是4吧,会是个数组吗?你还可以输出一下p和p++的值,看看它们相差多少?应该是3吧! 这第三句就更简单了,一个简单的赋值语句,把二级指针a(也就是二维数组...

C语言 如何初始化字符串为空串
答:‘’是两个单引号 \0 是转义字符,这两种办法都是可以的 由于空字符的ASCII码是0,直接赋值为0也是可以的

c语言 怎么把一个二维数组初始化为空
答:void *memset(void*,int,unsigned);其中void*表示起始地址,int 表示要填充的值,最后的unsigned表示填充的字节数。例如:include<string.h> void main(){ int a[10][20]={0}; //方法一,所有初始化为0 int *p[10][20]={NULL};char c[10][20]={'\0'};double b[50][200]};memse...

非常头疼的C语言编程问题!!!
答:指针应该用声明语句或赋值语句初始化,可以把指针初始化为0、NULL或某个地址,具有值0或NULL的指针不指向任何值,而要想把某个变量地址赋给指针,需使用单目运算符&(称为“地址运算符”)。 例如程序已用声明语句 - class="code" width="100%">int *ptra, a=3; -> 声明了整型变量a(值为3)与指向整数值的...

C语言二级指针调用问题
答:temp = list + i + j;// 获取指针 貌似应该是 list[i] + j 按照你的逻辑来说