C语言指针问题【精粹+附图】
发布网友
发布时间:2022-12-22 20:26
我来回答
共3个回答
热心网友
时间:2023-12-20 18:34
我是这样看的,画一个内存的存储结构图就好了:
1.字符串”0ABCDEF“在内存中的存储格式,如下图所示,当调用fun函数时,语句*p=s,表示将s指向的内存地址赋给了指针p,此时指针p和s都指向了堆栈顶部的地址 0000 0001。
2.在判断while(*p!=0)中,具体是判断p指向的字符与数字0之间的比较,显然,只有当p指向"\0'时,这个while循环才会结束,此时p的地址为0000 0008,但是s的地址依然在0000 0001,具体如下图所示:
3.因此,当执行return时,p-s的值就是0000 0008 - 0000 0001,显然结果就是7了。
当然,具体的地址肯定不是如此,不过应该不影响理解的。
热心网友
时间:2023-12-20 18:35
#include<stdio.h>
int fun(char s[])
{
char *p=s;
while(*p!=0) //这里的0 转换成char就是'\0',而不是'0'
p++;
return (p-s);
}
main()
{
printf("%d\n",fun("0ABCDEF"));//深刻的理解一下这里的字符串,字符串中字母的值
}
//字符串实际是"0ABCDEF\0",最后\0的值才是0,第一个0是'0',是48
热心网友
时间:2023-12-20 18:35
*p!=0等价于*p!='\0',不等价于*p=='0',所以p指向s[]的第一个元素时并不结束循环
C语言指针问题【精粹+附图】
1.字符串”0ABCDEF“在内存中的存储格式,如下图所示,当调用fun函数时,语句*p=s,表示将s指向的内存地址赋给了指针p,此时指针p和s都指向了堆栈顶部的地址 0000 0001。2.在判断while(*p!=0)中,具体是判断p指向的字符与数字0之间的比较,显然,只有当p指向"\0'时,这个while循环才会结束,此...
C语言问题:指针
r->next=p,即令r的下一个结点指向p,图上表示就是r所指的结点画一个箭头指向p所指的结点。此时改变p所指的结点内容,相当于改变r->next所指的结点内容;但若改变p的指向,使其指向其他结点,则对r->next所指的结点无关且不再产生任何影响。
关于C语言指针的一个问题?
图中1处指针p没有初始化,它没有指向任何内存单元不能进行图中2处的赋值写入操作,这里会程序崩溃退出。
C语言 关于POINTER(指针)的问题, 急!!!
指针就是地址,作用是指向一个变量的地址
C语言中指针问题求解,这张图什么意思?
ptrl是一个两字节的指针,它指向urn[0],即 00DC 的位置 ptrl是表示指针指向的值,当前为 0x100 右边的图:ptrl = urn; //把ptrl的值,设置为urn的起始地址 ptrl指针的内存地址为 0x0C00,它的值为 0x00DC,即ptrl指针 指向urn[0]的地址。因为 ptrl是两字节指针,如果执行 ptrl++,...
C语言指针问题
一、如有定义char y[4]= "321"则表达式 *y+2的值是'5' 。分析:y是字符串数组首元素'3'的地址,*y的值就是字符'3',再加上2,就是字符'5'(也可以说是字符'5'的ASC码值)。二、 如有定义char z[2][4]={"MAT", "LAB"};,则表达式*(*z+2)的值是 'T'。分析:z是二维字符...
C语言指针问题
1、ptr赋值为arr地址后指向第一个元素,即元素6.2、*(ptr++) += 123;由于是右侧操作(递增后缀),所以先取ptr地址后再递增ptr,此时取得的地址还是第一个元素地址(递增后ptr指向第二个元素,也就是7,这是第一次递增),因此是对6+123=129,并保存原地址,即第一个元素地址,因此6被改为129...
c语言指针问题,求解答
首先 函数指针的定义 A、D定义为:A 定义指向函数的指针pf,所指向的函数参数为空,无返回值 D 定义指向函数的指针pf,函数参数为int,char型(不符题意,题目为int,char*),无返回值 B、D的定义为:定义函数pf,函数参数为空,返回类型为void *(void 型指针)单从函数指针的定义可排除BCD。其次...
c语言指针问题
pp是一个二维字符串类型的指针,也就是说它能保存2*3=6个字符串地址,每个字符串都只保存地址,这样就不限制大小,所以保存的是字符串;pp是这个指针的名字,它也代表的是该指针的首地址!pp是取pp的值,即它保存的地址!等价于pp[0];看1,***(pp+1),其中pp+1代表第二行,*(pp+1),即就...
C语言指针问题
1.这里根本就没有赋值的语句,所以没有复制。(*s)&&(*t)&&(*t++==*s++) 这个条件就是没到s的结束且没到t的结束且*t == *s,就循环,t和s的指针都往后移。2.p是指针数组,就是有两个指针 for(i=0;i<2;i++) p[i]=ch[i];这个就是赋值给p指针,其中p[0] 等于ch二维...