c语言-有关C语言指针的传递问题

问题描述

有关C语言指针的传递问题

int i = 3 ;
int *p ;
p = &i ;
int *q = p;

问题:先定义一个数值为3的变量 i 。然后把i的地址传递给变量p。那么变量p的内存单元中存储的就是i的地址,假如说是2000,那么p就是2000.
*p就是间接访问i,也就是说*p是3.
再定义一个变量q。*q也是间接访问的数值,这里等于p,也就是说*q 是2000.
我的理解是内存中存在一个变量,里面存的是2000.那么我如果输出q。那么就应该是
内存中数值为2000的这个变量的地址对吗?至于数值等于2000是哪一个地址,我不知道,但是这里的*q确实是间接访问了数值为2000的变量,假如存在无数多个这样的地址,那么最少计算机也应该随机输出一个地址才对。
但运行的结果 *q的值等于i 等于 2;而q 存储地址的数值等于p的存储地址的值。
那么刚刚我列出的是*q = p 。而计算机实际上运行的结果怎么就是q = p 呢?
代码:
# include
main(){
int i = 2 ;
int *p ;
p = &i ;
int *q = p;
printf("%dn",*q);
printf("%dn",q);
printf("%dn",*p);
printf("%dn",p);

}

解决方案

首先int * p表示p是变量,它的类型是int *,也就是说p只能存储int类型变量的地址,此处不能将*p可作变量。
所以

 int i = 2;
 int * p;
 p = &i;

等价于

 int i = 2;
 int * p = &i;

同样你下面的

 int * q = p;

应该理解成定义了一个q变量,它的类型是int *,意思就是q变量中只能存储int类型变量的地址
这句其实只是给q变量赋值,意思是你把p变量的值赋给了q。
而p变量中保存了i的地址,所以q变量中此时也保存了i变量的地址。
这样的话p变量和q变量同时指向了i变量在内存中的那块存储单元。
此时*p和*q完全等价于i变量,所以输出*q是i的值,说出q是i变量的地址

系统本身会为p变量分配内存单元,这个内存单元是用来存储i变量的地址200
但p变量本身分配的内存单元编号(内存单元编号就是地址)绝对不是这个2000,是另外一个值。
如果q中真想保存p变量本身的地址,实际上需要多级指针变量int ** q = &p,

解决方案二:

 int *q = p;不就是q=p嘛 这里的【*q】是指针变量,变量是q,不是说【*q】是一个变量,

解决方案三:

q的值跟p是一样的。他们都指向i的地址,这样p,q本身的地址不一样嘛,因为他们是不同的变量,分配不同的地址
但是*p,*q是访问他们指向地址的值,都是i的值,所以相同。

解决方案四:

#include

main(){
int i = 2 ; //定义了一个整形变量i,值为2
int *p ; //定义了一个指向int的指针变量p,相当于指针变量p存放的是一个地址
p = &i ; //把i的地址赋值给指针p
int *q = p; //把指针p的地址赋值为指针q
printf("%dn",*q); //输出的是指针q地址的地址,即i的值2
printf("%dn",q); //输出的是q的地址
printf("%dn",*p); //输出的是p的地址的地址
printf("%dn",p); //输出的是p的地址
}
这些都很基础,你应该是才开始接触C指针吧!

解决方案五:

你前面所有的理解都是对的,唯独int *q = p;这句理解有误,其实按你的需求,代码应该这样写
int *q = 0;
*q = p;这样你才是将p这个地址值赋值给了*q;
因为在c/c++中声明指针的时候同时赋值的话其实是给指针赋值而不是给指针指向的内存赋值。

解决方案六:

个人认为C语言是门很“硬”的语言,同样C语言的精华“指针”也是一个“硬件”术语~
“*”“&”在表示什么,C语言语法里肯定有明确说明,但重要的是理解这些,需要计算机硬件,计算机基本组成有所了解~
这是之前接触指针整理的博客,希望对你有帮助~
http://blog.csdn.net/yunfenglw/article/details/24867883

解决方案七:

个人认为C语言是门很“硬”的语言,同样C语言的精华“指针”也是一个“硬件”术语~
“*”“&”在表示什么,C语言语法里肯定有明确说明,但重要的是理解这些,需要计算机硬件,计算机基本组成有所了解~
这是之前接触指针整理的博客,希望对你有帮助~
http://blog.csdn.net/yunfenglw/article/details/24867883

解决方案八:

此处不能将*p可作变量
纠正我刚才打字的几个错误:
应改成:
此处不能将*p看作定义的变量
还有
系统本身会为p变量分配内存单元,这个内存单元是用来存储i变量的地址200
应改成:
系统本身会为p变量分配内存单元,这个内存单元是用来存储i变量的地址2000
另外内存中地址(内存单元编号)都是以16进制展示,此处2000是按你上面举的例子解释。

时间: 2024-07-28 15:01:46

c语言-有关C语言指针的传递问题的相关文章

C语言中二维数组指针的简要说明_C 语言

C语言中,指针是一个复杂但又灵活多变的知识点,我们知道,在一维数组中,对于一个数组a[],*a,a,&a,都表示a的首地址,但如果与二维数组混合使用,就显得更为复杂了.例如对于一个二维数组 a[2][4]={{1,2.3},{4,5,6}} a+i,&a[i],*(a+i),a[i], 这四个表达式到底表示什么呢? 先告诉答案吧,其实这几个表达式都是指向同一个地址的,也许你会很诧异,也会很疑惑,怎么会是这样呢!!事实证明就是这样的, C语言中,指针是一个复杂但又灵活多变的知识点,我们知道,

C语言 结构体和指针详解及简单示例_C 语言

指针也可以指向一个结构体,定义的形式一般为: struct 结构体名 *变量名; 下面是一个定义结构体指针的实例: struct stu{ char *name; //姓名 int num; //学号 int age; //年龄 char group; //所在小组 float score; //成绩 } stu1 = { "Tom", 12, 18, 'A', 136.5 }; //结构体指针struct stu *pstu = &stu1; 也可以在定义结构体的同时定义结构

c语言,形参是指针的引用,和形参是指针,两者结果不同,求指点

问题描述 c语言,形参是指针的引用,和形参是指针,两者结果不同,求指点 自定义的头文件 typedef struct BiTNode { int data; struct BiTNode *lchild, *rchild; }BiTNode, *BiTree; 如下是使用形参是指针的引用的函数,结果是正确的 #include "BiTree.h" #include "stdlib.h" #include "stdio.h" bool Delete

函数指针 c语言 指针-C语言指向函数的指针的调用

问题描述 C语言指向函数的指针的调用 int *d_bubblesort(int a[]int n)//数组长度为n的冒泡降序排序{int ij;int temp;for(i=0;i {for(j=n-1;j>i;j--){if(a[j]>a[j-1]){temp=a[j-1];a[j-1]=a[j];a[j]=temp;} }}return(a);} void main(){int i;int *p;int a[10]={65412398710};int (*fun)(intint);fun

c语言-C语言结构体的指针问题。

问题描述 C语言结构体的指针问题. struct GenInfo { uint64_t (*next)(struct GenInfo * const); enum GeneratorType type; union { struct GenInfo_Constant constant; struct GenInfo_Counter counter; struct GenInfo_Discrete discrete; struct GenInfo_Exponential exponential;

c语言 排序题(指针) 指针我学的不是很好,请问我的代码哪里有问题?

问题描述 c语言 排序题(指针) 指针我学的不是很好,请问我的代码哪里有问题? 描述 将输入的四个整数按由大到小的顺序输出. 已定义如下swap函数,可实现形参pa和pb所指内存单元的内容交换.请务必使用本函数实现两个变量内容的互换. void swap( int *pa, int *pb) { int t; t=*pa; *pa=*pb; *pb=t; } 输入 输入包含多组数据,每组输入4个整数,用空格隔开. 输出 根据每组输入,输出排序后的4个整数,由空格隔开.输出占一行. 样例输入 4

struct-C语言结构体变量指针问题,求助

问题描述 C语言结构体变量指针问题,求助 #include #include #include #define N 10 typedef struct { char name[10]; double price; struct { int year;int month;int day ;}date; }STREC; int fun(STREC a,double p) { int i,j=0; double q; for(i=0; i < N ; i++,a++) { q=a->price; i

malloc-C语言中的字符指针操作问题,如何释放字符指针空间?

问题描述 C语言中的字符指针操作问题,如何释放字符指针空间? 源码如下: #include #include #include void main() { char s1; char *s2 = "bbb"; char *s3 = "ccc"; s1 = (char)malloc(sizeof(s2)); strcpy(s1, s2); strcat(s1, s3); //free(s2); //free(s3); printf("%s ", s

c语言 计算机二级 字符指针

问题描述 c语言 计算机二级 字符指针 我认为该选c,但标准答案给的a 求解啊 解决方案 #include <stdio.h> int main() { char a[] = "china", *p; p = a; printf("%c %c ", *p, a[0]); //c c 两值相等 C也是对的 printf("%p %p ", p, a);//0x7fffcdfc9220 0x7fffcdfc9220 我觉得A不是对的,虽然