C语言指针的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言指针的问题相关的知识,希望对你有一定的参考价值。

static int a[10]1,3,5,7,9

int *p=a;

printf(
"%d",*p++**++p);输入的值等多少?

这一步代表什么意思int *p=a;
还有结果等多少?
具体步聚
运算从左至右:答案为5
运算从右至左:答案为9
我都晕了..
运算应该是从右至左哇...选择题里四个选项都没有9
可正确答案是5

参考技术A int *p=a;表示 把整形数组a的首地址赋给p
p指向a

打印的结果为9

按照生成的汇编代码分析过程如下
; 16 : printf("%d",*p++**++p);
mov eax, DWORD PTR _p$[ebp] //
add eax, 4 //p增加4字节,指向3的位置
mov DWORD PTR _p$[ebp], eax //
mov ecx, DWORD PTR _p$[ebp]
mov edx, DWORD PTR _p$[ebp]
mov eax, DWORD PTR [ecx] //3放入寄存器eax
imul eax, DWORD PTR [edx] //3*3放入寄存器eax 因为ecx 和edx的值相当 注意前面2句话
mov DWORD PTR -8+[ebp], eax //eax存放着结果9
mov ecx, DWORD PTR -8+[ebp] //下面这些语句准备打印
push ecx
push OFFSET FLAT:??_C@_02MECO@?$CFd?$AA@ ; `string'
mov edx, DWORD PTR _p$[ebp]
add edx, 4
mov DWORD PTR _p$[ebp], edx
call _printf
add esp, 8

通过上面分析*p++**++p这个表达式计算是从右向左进行的。
参考技术B int *p=a是让指针p指向数组a的首地址
*p++ * *++p从右向左执行
因为++p=a[1],由于++p先计算再取值,所以现在指针p所指的是a[1]中的值,为3
p++的表达式先取值在向下移动指针,所以指针p先取出a[1]中的值,然后再把指针移向a[2],虽然指针指向a[2],可是p中取值还是3
3*3=....
参考技术C *p++**++p p是数组a的首地址,而*p++是先取值后p的值加1,*++p恰好相反,因此*p++就是a[0]=1,之后p+1,在*++p中p先加1后,p为a[2]=5,
相乘的结果为1*5=5本回答被提问者采纳

c语言指针变量问题

#include<Stdio.h>
#include<stdlib.h>
main()

int *ptr=NULL;
int num,i;
printf("请输入待输入的整数的个数");
scanf("%d",&num);
ptr=(int *)malloc(num * sizeof(int));
for(i=0;i<num;i++)

printf("请输入第%d个整数",i+1);
scanf("%d",&ptr[i]);

printf("你输入的整数是:");
for(i=0;i<num;i++)

printf("%d",ptr[i]);

free(ptr);
return 0;

scanf("%d",&ptr[i])是什么意思?printf("%d",ptr[i])可以直接输出ptr指针?ptr不是指针变量吗?为什么使用scanf存入时好要在ptr前加&?

c 语言中,形式逻辑不成立,指针书写的外形,在声明中和在语句中,外貌相同,意思不同!
int *ptr; 这是声明,声明 ptr 是指针,用于指向 int 型变量。
语句中 *ptr 表示 指针指向的数值, ptr 表示 指针指向的地址。有*的是值,没星号的是地址。
ptr=(int *)malloc(num * sizeof(int)); 这是动态分配,分配了num个int型数值的存放空间,ptr 表示 指针指向的地址(分配了的空间的“始地址”)
你也可以理解成,定态声明了数组: int ptr[num]; 数组名ptr, 有 num个元素。
scanf("%d",&ptr[i]); ptr[i] 是数组第i号元素的值。&ptr[i] 是数组第i号元素的地址。
printf("%d",ptr[i]); 输出 ptr数组第i号元素的值.
---
深入理解:
语句里,ptr[i] 里的[] 实质上是运算符,ptr[i] 等价于 *(ptr+i)。是值。
语句里,&ptr[i] 等价于 (ptr+i) ,是地址。等于: ptr的地址+i * sizeof(int)。
参考技术A ptr申请了num个int型内存区域后,int *ptr就等价于int ptr[num]。
scanf("%d",&ptr[i])的意思是获取你输入的整数,赋值给ptr[i]。
printf("%d",ptr[i])输出的并不是ptr指针,而是ptr[i]的值,因为数组可以用下标取值。
ptr是指针变量,但是ptr[i]不是指针变量,ptr[i]可以理解为一个int型变量。
使用scanf存入时,&并不是加在ptr上,而是加在ptr[i]上,取的是ptr[i]的地址。[ ]的运算优先级高于取地址符&。
参考技术B 1、给指针变量赋初值在语法上是没有错误的,编译执行也可以通过,但是一旦代码量增多后,很容易造成指针的错用,为了防止这一问题最好将指针变量定义的时候就置成NULL,这样做是为了代码安全着想。 2、指针定义后就会随机指向一个位置的,编译的时候也不会提示错误,程序短很容易找出来,长了多了就难找了,所以这是一个好习惯吧。 参考技术C scanf("%d",&ptr[i])是从键盘读入一个十进制整数,并存入到数组元素ptr[i]中。
int *ptr=NULL;
ptr=(int *)malloc(num * sizeof(int));
是根据输入的num的大小动态申请数组的方法。ptr是一个指针(同时也是ptr数组的数组名)
相当于静态申请数组
int ptr[num];
的作用,只是这两都分别从系统的位置不同区域申请内存(初学者可暂时忽略这一点,使用上是完全一样的)。
ptr[i]就是这个数组中的一个成员,加上取地址符&,就是告诉C系统,读取到的数据要存放的位置,
scanf("%d",&ptr[i]);完全等同于scanf("%d",ptr+i);---------scanf函数的使用格式如此,必需要使用数据存放地址的。
参考技术D int *ptr是指针,malloc了num个int后,ptr指向这段连续的内存,ptr其实就是num个int的数组的头指针,也可以将ptr认为元素是int的数组。[]符号你可以认为是取值操作,那么ptr[0]或者*(ptr)就是第一个元素,ptr[1]或者*(ptr+1)就是第二个元素...
scanf("%d",&ptr[i])就是依次对这个数组(连续的内存)赋值。
scanf的函数定义,这里是个地址,也就是指针,&是取地址操作,也可以写成scanf("%d", ptr+i);
printf("%d",ptr[i])是输出第i个元素(连续内存的第i个值)

以上是关于C语言指针的问题的主要内容,如果未能解决你的问题,请参考以下文章

C语言动态开辟指针的指针问题

c语言 指针问题

c语言 指针问题

C语言,指针问题

关于C语言里面指针赋值的类型问题,还有一些关于指针的问题

C语言指针问题171