基础-关于C语言指针相加问题

问题描述

关于C语言指针相加问题

代码:

include

main(){
int a , *p;
a = 3 ;
p = &a ;
int *q = p + 1;
printf("p is %d",p);
printf("q is %d",q);
printf("*q is %d",*q);

}
运行结果:

p is 2293308q is 2293312*q is 2293312

Process exited after 0.1425 seconds with return value 13
请按任意键继续. . .

我的理解是:变量P存储了指针a。而变量q是指针+指针,也就是说,变量q是加的是a地址后面的那个变量,至于这个变量值是多少,我不知道,可能是一个有效值,也可能是一个垃圾值,我在第三个输出的时候是*q。也就是说把这个有效值或者垃圾只输出,但是实际电脑运行的结果是地址,那么我的问题是:*运算符不是获取数据运算符吗?

解决方案

修正下
a p q的地址关系为 p=a+4 q=p+4(4就是一个整数的大小)
p的值等于a的地址
q的值等于p+1,也就是p的地址+sizeof(int)=p的地址+4,正好也是q的地址
对q再取值,因为前面分析了,q的值就是q的地址,所以q的取值就是q

解决方案二:

p的值等于a的地址
q的值等于p+1,也就是a的地址+sizeof(int)=a的地址+4,正好也是p的地址
q的指针就是q的地址,因为你在堆栈上依次分配了a p q,所以相当于p的地址+4

解决方案三:

对于int * p;的理解很重要

int a , *p;
a = 3 ;
p = &a ;

此处int * 应该看作一个整体一种数据类型,p是变量,
表示p中只能存储int型变量的地址
所以上面的语句也等价于

 a = 3 ;
 int a , * p= &a ;

同样这句

 int *q = p + 1;

表示定义了int *类型的变量q,注意此处变量是q,并不是*q,
这句表示把p+1的值赋给变量q,
p中存储的是a变量的地址,p+1表示a变量在内存中的地址(内存单元编号)加1
所以q变量中存储的a变量的地址(内存单元编号)+1的值。
这个时候p,q都是不同的地址(不同的内存单元编号)
q所指向的这个内存单元(a的内存单元编号+1的那块内存单元)在程序中并没有人为的赋值,
所以编译器会随机赋给它一个垃圾值。这样的话会输出*q输出的值实际上是编译器给的垃圾值。
你不能觉得这个值大就认为它是地址。
如果真的想修改q所指向的内存单元的变量的值,应该编写如下的代码:

 int *q = p + 1;
 *q = (*p) + 1

这个时候输出*q应该就是4了
应为*是取地址运算符的逆运算,
p指向了a的存储单元,*p完全等价于a
所以(*p) +1 = 3 + 1
这个*q就表示以q的内容为地址的变量,*q就是4了

解决方案四:

我输出的结果是这样子的

解决方案五:

*q 哪里是地址了,我不认为

解决方案六:

看吧,*q 的值不就变了

时间: 2024-12-31 19:25:39

基础-关于C语言指针相加问题的相关文章

C语言指针基础

C语言指针 前导程序 #include<stdio.h> void change(int *); int main() { int a=90; change(&a); printf("a=%d\n",a); return 0; } void change(int *n) { *n=10; } 一.基本知识点 Int a=10; Int *p;//定义一个int类型的指针 P=&a;//指针变量p指向了变量a *p=20;//使用指针不通过变量直接修改变量a的

Swift与C语言指针结合使用实例

  这篇文章主要介绍了Swift与C语言指针结合使用实例,本文讲解了用以输入/输出的参数指针.作为数组使用的参数指针.用作字符串参数的指针.指针参数转换的安全性等内容,需要的朋友可以参考下 Objective-C和C的API常常会需要用到指针.Swift中的数据类型都原生支持基于指针的Cocoa API,不仅如此,Swift会自动处理部分最常用的将指针作为参数传递的情况.这篇文章中,我们将着眼于在Swift中让C语言指针与变量.数组和字符串共同工作. ####用以输入/输出的参数指针 C和Obj

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的这个变

C语言指针入门学习面面观_C 语言

这似乎是一个很凝重的话题,但是它真的很有趣. 1. 指针是指向某一类型的东西,任何一个整体,只要能称为整体就能拥有它自己的独一无二的指针类型,所以指针的类型其实是近似无穷无尽的 2. 函数名在表达式中总是以函数指针的身份呈现,除了取地址运算符以及sizeof 3. C语言最晦涩难明的就是它复杂的声明: void (*signal(int sig, void (*func)(int)))(int),试试着把它改写成容易理解的形式 4. 对于指针,尽最大的限度使用const保护它,无论是传递给函数,

在C语言编程中使用变量的基础教程_C 语言

C语言在明面上将数的变量分为两类,整型变量以及浮点数,对应着现实世界的整数和小数. 首先是整数,使用了这么多的C语言之后,每当在使用整数之时都会将其想象成二进制的存在,而不是十进制.原因在于,这是程序的本质所在,稍有研究编译器工作原理的都会发现,在编译器处理乘法乃至除法的时候,优秀的编译器总会想方设法的加快程序的速度,毫无疑问在所有运算中移位运算是最快速的"乘法"以及"除法": 1<<2 == 4 ,8>>2 == 2 而正常一个乘法相当于十

Swift与C语言指针结合使用实例_Swift

Objective-C和C的API常常会需要用到指针.Swift中的数据类型都原生支持基于指针的Cocoa API,不仅如此,Swift会自动处理部分最常用的将指针作为参数传递的情况.这篇文章中,我们将着眼于在Swift中让C语言指针与变量.数组和字符串共同工作.####用以输入/输出的参数指针 C和Objective-C并不支持多返回值,所以Cocoa API中常常将指针作为一种在方法间传递额外数据的方式.Swift允许指针被当作inout参数使用,所以你可以用符号&将对一个变量的引用作为指针

C语言指针使用方法

为初学者服务.这是本文的宗旨.指针是c和c++中的难点和重点.有些程序员们精通dos下的basic.c语言的其它各种特性,在basic中都有类似的东西.只有指针,是baisc所不具备的.指针是c的灵魂. 我不想重复大多数书上说得很清楚的东西,我只是把我看过的书中说得不清楚或没有说,而我又觉得我理解得有点道理的东西写出来. 1.指针的概念 指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址.要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指

c语言-新人,C语言,指针,帮我看看怎么改好吗?

问题描述 新人,C语言,指针,帮我看看怎么改好吗? #include void sort(int *a); main(void) { int i,a[10]; float sum=0.0; int *p; p=a; printf("输入10个数n"); for(i=0;i<10;i++) { scanf("%d",p++); } p=a; sort(p); printf("最大值为%d,最小值为%dn",*p,*p+9); for(i=0;

c语言-C语言指针,字符串复制过程的问题

问题描述 C语言指针,字符串复制过程的问题 下面是字符串复制的代码,str1[]如果限定大小为10,则会溢出,结果是s2正常,s1输出为 u? 请问为什么是这个结果呢? #include #include int main(){ char *s1; char *s2; char str[] = {""How are you?""}; char str1[10]={}; s1 = str; s2 = str1; while ((*s2 = *s1) != ''){ s