精华内容
下载资源
问答
  • 指针、数组和指针算数 指针和数组基本等价的原因在于指针算数c++内部处理数组的方式。指针变量加1,增加的量等于它指向的类型的字节数。将指向double的指针加1后,如果系统对double使用8字节存储,则数值增加8字节。...

    指针、数组和指针算数

    指针和数组基本等价的原因在于指针算数c++内部处理数组的方式。指针变量加1,增加的量等于它指向的类型的字节数。将指向double的指针加1后,如果系统对double使用8字节存储,则数值增加8字节。
    下面的例子展示了指针、数组和指针算数。指针和指针都可以通过指针和数组的方式获取数组的值。

    #include <iostream>
    
    int main()
    {
        using namespace std;
        double wages[] = { 10000,20000,30000 };
        short stacks[] = { 3,2,1 };
    
        double* pw = wages;
        short* ps = &stacks[0];
    
        cout << "pw = " << pw << ", *pw = " << *pw << endl;
        pw = pw + 1;
        cout << "pw + 1   " << endl;
        cout << "pw = " << pw << ", *pw = " << *pw << "\n\n";
    
        cout << "ps = " << ps << ", *ps = " << *ps << endl;
        ps = ps + 1;
        cout << "ps + 1   " << endl;
        cout << "ps = " << ps << ", *ps = " << *ps << "\n\n";
    
        cout << "access elements with array notation\n";
        cout << "stacks[0]= " << stacks[0] <<", stacks[1]= "<<stacks[1] << "\n\n";
    
        cout << "access elements with pointer notation\n";
        cout << "*stacks= " << *stacks << ", *(stacks+1)= " << *(stacks + 1) << "\n\n";
    
        cout << sizeof(stacks) << " size of stacks\n";
        cout << sizeof(ps) << " size of ps\n\n";
    
        ps--;
        cout << "ps[0]= " << ps[0] << ", ps[1]=" << ps[1] << ", ps[2]=" << ps[2] << "\n";
        cout << "*ps= " << *ps << ", *(ps+1)=" << *(ps+1) << ", *(ps+2)=" << *(ps+2) << "\n";
    
        return 0;
    
    }
    

    输出

    pw = 00DAFA28, *pw = 10000
    pw + 1
    pw = 00DAFA30, *pw = 20000
    
    ps = 00DAFA18, *ps = 3
    ps + 1
    ps = 00DAFA1A, *ps = 2
    
    access elements with array notation
    stacks[0]= 3, stacks[1]= 2
    
    access elements with pointer notation
    *stacks= 3, *(stacks+1)= 2
    
    6 size of stacks
    4 size of ps
    
    ps[0]= 3, ps[1]=2, ps[2]=1
    *ps= 3, *(ps+1)=2, *(ps+2)=1
    

    c++将数组名解释为地址。多数情况下c++将数组名解释为数组第一个元素的地址。 以下2种定义方式是等价的。

        double* pw = wages;
        short* ps = &stacks[0];
    

    从输出可知,*(stacks+1), stacks[1], *(ps+1), ps[1]是等价的。通常使用数组表示法时,C++都会执行以下转换:

    arrayname[i] becomes *(arrayname + 1)
    如果使用的是指针,而不是数组名,c++也会执行相同的操作:
    ptrname[i] becomes *(ptrname + 1)
    因此,在多数情况下,可以用相同的方式使用数组名和指针名。对于他们,可以使用数组方括号表示法,也可以使用指针解除引用运算符(*)。

    二者由2点不同:

    1. 可以修改指针的值,而数组名是常量
       ptrname = ptrname + 1;//valid
       arrayname = arrayname + 1;// not valid
      
    2. 对数组使用sizeof得到的是数组的长度,对指针使用得到的是指针的长度,即使指针指向的是一个数组。例如本例中对stacks数组和ps指针使用sizeof得到的结果:
    6 size of stacks
    4 size of ps
    
    数组的地址
    数组名被解释为数组第一个元素的地址,而对数组名应用地址运算符时,得到的是整个数组的地址。二者略有不同。
    short tell[10];
    cout<<tell<<endl;
    cout<<&tell;
    

    二者虽然在数值上是相同的;但是从概念上说,&tell[0](即tell)是一个2字节内存块的地址,而&tell是一个20字节的内存块的地址。因此,表达式tell+1将地址值加2,而&tell+1将地址值加20.

    展开全文
  • 指针本身也是一个变量,它存放的是某个变量的地址,它本身也是存在地址的,而指针本身也是一个变量,它所存放的是一个地址(比如0X00121212)是一个整型,所以指针变量本身是一个int类型,占据内存4个bit。...

    地址本身是由32根引脚输入高低电位(高电位1,低电位0),地址本应该是由32位0或1组成,但这样太长了,所地址用十六进制来表示。

    1:什么是 指针

        在c语言中指针是内存单元的编号,通过编号就可以准确找到内存中相应的位置,所以指针也是地址。

        指针本身也是一个变量,它存放的是某个变量的地址,它本身也是存在地址的,而指针本身也是一个变量,它所存放的是一个地址(比如0X00121212)是一个整型,所以指针变量本身是一个int类型,占据内存4个bit。

    2 :指针的类型的影响

         在c语言只,指针可以是int*(整型指针),char*(字符指针)等等,它的类型取决于它所指变量的类型。

        而不同类型的指针在进行指针运算的时候,过程是不同的,不同指针在解引用 一次能访问的字节不同(指针的权限不同),指针类型决定指针向前和向后最小单位能走多远的距离。

    int* -->一次访问4个字节

    char* -->一次访问1个字节

    double* -->一次访问8个字节

     地址内数据是将二进制转化为十六进制,da。

    不同类型的 指针所占内存大小一样;

    指针的加减运算

    * 解引用操作符

    在解引用之前,a中的值为11223344, 但是当*pa=0运行后,全都变成0了;int* 一次改变了4个字节的数据;

    但是当指针类型为char时,*pc-0只能改变一个字节,因为char本身只有一个字节。

    运算

    整型指针加1,和字符指针加1,整型增加4,字符增加2;

    创建一个整型数组

    在数组中依次放入0 1 2 3 4 5 7 8 9,int* p=arr,数组名本身自带&符号,

    这个是将arr数组内第一个元素的地址存放在int* p中,

    *p 解引用后,相当于通过地址找到了数组的第一个元素,*p本身就等于arr数组的第一个元素。

    &a[9-&a[0] 

    两个指向同一块空间的指针才能进行减法,减法得到两个地址之间的元素个数;

    展开全文
  • 许多面试官常说:C程序员新手和老手的一大差别就在于是否对指针有深刻理解,能否高效利用指针。 笔者在此建立《深入理解C指针系列》专栏与大家分享我的C指针学习。 C语言编程的精髓就是对指针的精巧使用,利用指针...

    许多面试官常说:C程序员新手和老手的一大差别就在于是否对指针有深刻理解,能否高效利用指针

    笔者在此建立《深入理解C指针系列》专栏与大家分享我的C指针学习。

    • C语言编程的精髓就是对指针的精巧使用,利用指针变量可以表示各种类型的数据结构,并能想汇编语言一样处理内存地址,
      可以编出精炼而高效的程序。指针极大的丰富了C语言的功能。

    指针变量的大小

    指针变量的值就是某个内存单元的地址。
    指针的大小在32位机器上是4个字节,在64位机器上是8个字节。

    指针的类型

    指针的类型有int,char,float,double等。指针的类型决定了指针向前或向后走一步的长度。
    在这里插入图片描述
    p1和p2指针走一步的位置会如何呢?

    在这里插入图片描述

    p1是char指针,每次访问1个字节。
    p2是int 指针,每次访问4个字节。

    空指针

    *int p=NULL; 表示指针指向0地址处的空间。
    NULL宏是强制类型转换为void指针的整数常量0.在<stdio.h>中定义为:
    在这里插入图片描述

    我们定义指针是,经常将指针用NULL初始化。
    值得注意的是:用户无法对0地址空间(NULL)直接解引用。否则,就会引起程序崩溃。尤其在函数传参时经常会忽略这一问题。
    在《剑指offer》中有这样一段代码:

    int StrToInt(char* string)
    {
    	int number = 0;
    	while (*string != 0)
    	{
    		number = number * 10 + *string - '0';
    		++string;
    	}
    	return number;
    }
    

    面试官不能容忍的错误就是程序不能鲁棒。以前面的代码为例,只要输入一个空指针,程序立即崩溃。这样的代码如果加入软件当中,那么将是灾难。因此,当面试官看的代码中对空指针没有判断并加以处理的时候,通常连往下看的兴趣都没有。

    防止空指针被解引用

    我们在函数的开头判断一下空指针即可。通常采用包含着**<assert.h>** 中的 assert函数,assert(p);
    在这里插入图片描述
    如果string不为空指针,这什么事都不会发生。
    相反,string为空指针是,会报错。
    在这里插入图片描述

    指针变量与整数的加减运算

    p+n;表示指针走n步。
    整形变量p+1表示的是在内存中与p相邻的下一个整形变量的地址。

    指针的比较,相减

    p1<p2表示p2的地址大于p1的地址
    指针相减的结果表示指针的步长。

    野指针

    野指针是指指针指向的未知内存。
    产生原因主要有:

    1. 指针未初始化。
    2. 指针越界访问
    3. 指针指向的空间被释放

    如何规避野指针?

    1. 指针初始化
    2. 小心指针越界
    3. 指针指向的空间被释放后,指针指向NULL
    4. 指针使用时检查有效性。

    标准规定

    C语言标准规定:允许指向数组元素的指针和指向数组最后一个元素后面的那个内存位置的指针进行比较,但是不允许与指向第一个元素之前的那个内存地址进行比较

    具体这个标准是什么意思,举例说明:
    在这里插入图片描述
    分别用方法1和方法2 初始化数组arr[5]。看似两种方法都能达到目的。
    由于C语言的规定:方法1比方法2好方法2要避免使用
    方法1中,指针vp从指向数组最后一个元素后面arr[5]的地址处一直递减到数组的首元素地址处。
    方法2中,指针vp从指向数组最后一个元素的地址处递减到首元素前面arr[-1]的地址处,并进行了指针的比较。这是标准不允许的。

    展开全文
  • C语言指针与自增自运算解析C语言是面向过程的程序设计语言,自上世纪七十年代提出,以其特有的魅力经久不衰,现在仍然广泛应用在不同的开(本文共1页)阅读全文>>一、背景介绍尽管大多数学生接触过钟表,有些学生...
  • 一、几种常见的const修饰指针 1、指针所指之物,不能改变 const int *p=&a; int const*p =&a; /*以上两种写法其实都是一样的,const在*p左边,表示*p不能改变 即不能给*p再进行赋值*/ ex://*p=100;错误 //p...
  • 例如: 16位编译器 char :1个字节 char*(即指针变量): 2个字节 short int : 2个字节 int: 2个字节 unsigned int : 2个字节 float: 4个字节 double: 8个字节 long: 4个字节 long long: 8个字节 unsigned long: 4个...
  • 在写文件IO时候需要用文件名和路径,发现在strncpy函数字符串相加含义的问题 char str1[64] = "1:/45/789/b"; //文件路径+文件名 const char *fullname = str1; //文件路径+文件名 const char *p = strrchr...
  • C语言指针和大小

    2021-11-07 10:04:03
    指针存放的是地址,p=p+2,加的数字是以指针指向的数据类型为量度的。比如 int a[10]; int *p=a; //p初始指向a的首元素地址,p+1即指向第二个元素 int a[2][3]; int *p=a; p=p+1; //p初始指向a的首行地址,p+1...
  • char arr[3];printf("arr:\n%d\n%d\n%d\n", arr, arr + 1, arr + 2);char *parr[3];...从结果可以看到,字符数组每个元素占1字节,字符指针数组每个占4字节。再看一个例子:char a = 'a', b = 'b', c ...
  • 代码如下: #include<stdio.h> int My_strlen(char* str) { char* start = str; char* end = str; while (*end != '\0') { end++; } return end - start; } int main() { ...运行结
  • 指针、自增(++)或者自(--)运算符,以及*这三个 运算符在同一个语句时,要注意++的作用点在哪里。测试代码:#include int main() {int i[] = {100, 200, 300, 400, 500};int *p = i;printf("...%d\n", *p++);...
  • C语言--指针

    2021-10-30 14:00:06
    指针一个整数 指针变量的大小都是四个字节,指针加1,是加了一个指针所指向类型的大小,不是加指针变量的大小。 #include <stdio.h> int main() { int m = 0; int *p; p=&m; printf("%p%p",p,p+1);//p...
  • 指针变量的加运算

    2021-09-09 15:41:58
    指针变量可以加,但是只能与整型数据加。此时加的含义并不是其地址值进行了加,而是与指针指向的数据类型相关联。如果指针变量 p 的值是0x20000000,那么 p=p+2 的值并不是 0x20000002,如果在 32 位的操作...
  • C语言指针用法

    2021-05-21 05:36:06
    指针作为形参指针作为形参和数组作为形参完全等价指针变量和数组名的异同指针变量和数组名在很多地方是类似的,都代表的是一个地址,作为形参完全等价差别:指针变量可以赋值但是数组名不行对指针变量进行sizeof运算...
  • 例子1:#include int main(){float arr[5] = {12.5, 10.0, 13.5, 90.5, 0.5};float *ptr1 = &arr[0]; //ptr1 is 925601136float *ptr2 = ptr1 + 3;// ptr2 is 925601148printf("%f ", *ptr2);...
  • 1、指针自增在程序中使用指针代替数组,因为变量指针可以自增,而数组不能自增,数组可以看成一个指针常量。以便顺序访问数组中的每一个元素。例如,#include const int MAX = 3;int main (){int var[] = {10, 50, ...
  • 指针值的自增与自\*p++ 、\*(p++)、(\*p)++、\*++p、 ++*p *p++ 、*(p++)、(*p)++、*++p、 ++*p *p++ & *(p++):先取*p的值,再对指针地址自增 A = *p++ 即 A = *p, p = p+1. 根据优先级顺序,自增自...
  • 针对 C 语言三大核心:数组、指针、函数,今天继续写技术文章。上次 C 语言写到了数组,有些书是先讲指针,有些书是先讲函数,按照我以前学习 C 语言的顺序,以及对 C 语言的理解,学习的顺序是这样的:数组--->...
  • c指针

    2021-08-24 17:18:40
    指针(p++ & p--) 如果ptr 指向位置为 1000 的 【整数】,ptr 每增加1,它都将指向下一个【整数】位置,即当前位置往后移 4 字节,指向【 1004】 位置。 如果 ptr 指向一个地址为 1000 的【字符】,ptr 每...
  • 原理是c语言中的指针后,会根据指针的类型采用不同的偏移量。 比如, int* a; int* b = a+1; 则 b - a = sizeof(int) char* a; char* b = a+1; 则b - a = sizeof (char) 将上述程序改写如下,更容易...
  • 10.指针变量加运算

    2021-10-20 11:37:14
    1.指针变量数据类型的作用? 1.1指针变量在32位操作系统占用4个字节,在64位操作系统中占8个字节 指针变量占用的内存大小和指针变量的数据类型无关 1.2指针变量的数据类型是专门用于告诉操作系统,在访问指向...
  • 一、指针的基本常识1.什么是指针?对于指针需要掌握以下几个基本的概念:<1>指针是一种变量类型,也是具有空间、内容、地址三个属性。空间属性值得是:在定义指针时,内存会给指针变量分配指定类型大小的空间...
  • C语言指针

    2021-05-21 07:32:25
    第6章 指针1. 指针指针简介:所有的数据都是存放在存储器中。一般把存储器中的一个字节称为一个内存单元,为了正确的访问这些内存单元,必须在每个内存单元编上号,根据一个内存单元的编号即可准确的找到该内存单元...
  • c语言指针用法详解,通俗易懂超详细!

    千次阅读 多人点赞 2021-07-18 00:10:30
    文章转自:无际单片机大家好,我是无际。今天给大家来讲解一下指针。我会由浅到深,最后结合实际应用讲解,让大家学会指针的同时,知道大佬们都用指针来干嘛!长文预警!全文大约5200多字,学指针看...
  • C语言指针——指针的运算,指针运算说指针之前,先说两个比较不相关的东西,也当做是一种知识的补充。看下面的代码:#include int main(void){char *s = "Hello world.";printf(s);}运行这段代码,会出现错误吗?...
  • 指针其实也是一个数据类型,它的值是一个数字,表示的是一个地址比如说:00000000 00001000 0000000000010000,对32位的计算机系统,那么指针应该也是4个字节,即有32位表示有2^32个地址,即可以遍历4g的内存空间。...
  • 指针±整数 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> int main() { int arr[5] = { 0 }; int *p = arr; int i = 0; for (i = 0; i < 5; i++) { *(p + i) = i;//*p++=i; 先解引用在加加...
  • 指针提供了对地址操作的一种方法,因此,使用指针可使得 C 语言能够更高效地实现对计算机底层硬件的操作。另外,通过指针可以更便捷地操作数组。在一定意义上可以说,指针是 C 语言的精髓。内存与地址在计算机中,...
  • 一、指针数组和数组指针的内存布局初学者总是分不出指针数组与数组指针的区别。其实很好理解:指针数组:首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身决定。它是“储存指针的数组”的简称。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 168,255
精华内容 67,302
关键字:

指针减指针