运用指针在不用加号的情况进行加法运算的讲解

平常我们进行加法运算都是用类似以下的代码进行运算

#include<stdio.h>
int main()
{
 int a=2,b=3;
 printf("%d\n",a+b);
 return 0;
}

其结果为 5,对a和b进行了加法运算

但我们如何不用加号进行加法运算呢?先看一段数组运算

#include<stdio.h>
int main()
{
 int a[]={1,2};
 printf("%d\n",a[0]+a[1]);
 return 0;
}

运行结果是 3 ,它和以下这段代码是相同的

#include<stdio.h>
int main()
{
 int a[]={1,2};
 printf("%d\n",*(a+0)+*(a+1));
 return 0;
}

因为 a[i]=*(a+i)

接下来我们简单运用一下指针

#include<stdio.h>
int main()
{
 int a=2,b=3;
 int *p=a,*q=b;
 printf("%d\n",*p+*q);
 return 0;
}

p和q分别指向了a和b的地址,将a和b的和计算,结果是 5

现在运用指针和刚才说的a[i]=*(a+i)和变量存放地址进行一下结合

#include<stdio.h>
int main()
{
 int a=2,b=3;
 int *p;
 printf("%d\t%d\n",&a,&b);
 p=&a;
 printf("%d\n",(int)&((char *)a)[b]);
 return 0;
}

输出结果是

1638212        1638208
5

前面两个值分别是a和b的地址,因为是int类型且在我用的32位编译器中是按四字节存储的,然而char类型是按照一个字节一个字节存储的,用指针p指向变量a,先看(char*)a,它是一个强制类型转换,将a这个变量强制转换成char*类型的地址,((char*)a)[b]则是将地址向后移b个字节,但此时的((char*)a)[b]等于*(a+b),我们知道&和*的作用相互抵消的,所以有了&((char*)a)[b],但此时它的类型仍为char*,前面的(int)则是将其强制转换位int进行输出。

当时时候用的long定义的a和b,如果强制类型转换为int,long是八字节,而int是四字节,那么就会造成数据丢失。

最后说一下刚得知的,可以用指针测试编译器到底是64位还是32位,64位的编译器指针变量是8字节,32位的则是4字节。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。如果你想了解更多相关内容请查看下面相关链接

(0)

相关推荐

  • C 语言指针变量的运算详解

    指针变量保存的是地址,本质上是一个整数,可以进行部分运算,例如加法.减法.比较等,请看下面的代码: #include <stdio.h> int main(){ int a = 10, *pa = &a, *paa = &a; double b = 99.9, *pb = &b; char c = '@', *pc = &c; //最初的值 printf("&a=%#X, pa=%#X, pb=%#X, pc=%#X\n", &

  • 基于C++输出指针自增(++)运算的示例分析

    复制代码 代码如下: #include "stdafx.h"#include <iostream>using namespace std;int _tmain(int argc, _TCHAR* argv[]){ char s[] = "012345678", *p = s; cout << "s:"<<s<<endl; cout << "*p++ = " <&

  • 简单分析C++指针的操作和运算

    既然指针是一种数据类型,那么它也应该有对应的操作或运算,正如整数能做加减乘除一样.但是每一种操作或运算都应该对这种数据类型有意义.比如两个实数可以用关系运算得知哪个大哪个小,而两个虚数却不能使用关系运算,因为比较虚数的大小是没有意义的. 对于指针类型来说,可以使用的运算有:和整数做加法运算.和整数做减法运算.两指针做关系运算.很显然,指针类型的乘除法是没有意义的,也是不允许的. 指针的加减运算 指针的加减法和数的加减法是不同的.我们认为,指针只能够和整数做加减法运算(包括和整型常量.变量做加减法

  • Go语言中的指针运算实例分析

    本文实例分析了Go语言中的指针运算方法.分享给大家供大家参考.具体分析如下: Go语言的语法上是不支持指针运算的,所有指针都在可控的一个范围内使用,没有C语言的*void然后随意转换指针类型这样的东西.最近在思考Go如何操作共享内存,共享内存就需要把指针转成不同类型或者对指针进行运算再获取数据. 这里对Go语言内置的unsafe模块做了一个实验,发现通过unsafe模块,Go语言一样可以做指针运算,只是比C的方式繁琐一些,但是理解上是一样的. 下面是实验代码: 复制代码 代码如下: packag

  • 详解C++中的成员访问运算符和指针到成员运算符

    成员访问运算符:. 和 -> 语法 postfix-expression       . name postfix-expression –> name 备注 成员访问运算符 . 和 -> 用来引用结构.联合和类的成员.成员访问表达式具有选定成员的值和类型. 有两种形式的成员访问表达式: 在第一种形式中,postfix-expression 表示结构.类或联合类型的值,name 为指定的结构.联合或类的成员命名.运算的值是 name 的值且为左值(如果 postfix-expressio

  • 基于指针的数据类型与指针运算小结

    1.指针的数据类型小结有关指针的数据类型 定义 含义 int i; 定义整形变量 int *p; 定义只想整型数据的指针变量p int a[n]; 定义整形数组a,它有n个元素 int *p[n]; 定义指针数组p,它由n个指向整形数据类型的指针元素组成 int (*p)[n]; 定义指向n个元素的一位数组的指针变量 int f(); f为带回整形函数值的函数 int *p(); p为带回一个指针的函数,该指针指向整形数据. int (*p)(); p为指向函数的指针,该函数返回一个整形数据 i

  • c++将引用或者是指针作为函数参数实现实参的运算

    C++增加引用类型, 主要是把它作为函数参数,以扩充函数传递数据的功能,较指针参数来得更加安全直观.将引用作为参数传递的时候,实参初始化形参的时候不分配内存空间,也不调用拷贝构造函数,因此更加能够提高运算的性能.所以我们应该尽可能地使用引用,而非指针,但是应该要注意,因为局部变量具有自己短暂的生命周期,因此不能够返回对一个局部变量的引用. 引用通常是在被定义的时候被初始化,但是当它作为参数的时候,则是在被调用的时候被初始化.这时候对引用所做的改变就是对被引用的变量所做的改变. 引用对变量的访问是

  • 学习二维动态数组指针做矩阵运算的方法

    本文分享了利用二维动态数组指针做矩阵运算的实现代码. 1. 头文件 // juzhen 2.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "stdlib.h" #include "windows.h" #define OK 0 #define NG -1 typedef struct mat { int nRow

  • C++中指针的数据类型和运算相关知识小结

    C++有关指针的数据类型和指针运算的小结 前面已用过一些指针运算(如p++,p+i等),现在把全部的指针运算列出如下. 1) 指针变量加/减 一个整数 例如:p++,p--,p+i,p-i,p+-i,p-=i等. C++规定,一个指针变量加/减一个整数是将该指针变量的原值(是一个地址)和它指向的变量所占用的内存单元字节数相加或相减.如p+i代表这样的地址计算:p+i*d,d为p所指向的变量单元所占用的字节数.这样才能保证p+i指向p下面的第i个元素. 2) 指针变量赋值 将一个变量地址赋给一个指

  • C语言中6组指针和自增运算符结合方式的运算顺序问题

    在C语言中,当指针运算符和++或者–结合时很容易分不清运算顺序,在这里总结一下,下面一共分析6中组合: * p++,(* p)++,* (p++),++* p,++( * p), * (++p). 先看段代码以及输出: #include<stdio.h> int main() { int a[3]={1,3,5}; int *p=a; printf("----------------1----------------\n"); printf("%d\n"

随机推荐