首页 > 其他 > 详细

指针2

时间:2021-03-29 09:11:58      阅读:26      评论:0      收藏:0      [点我收藏+]

指针运算(指针运算很容易产生野指针)

指针里面就存的是一个整数

 

指针+整数(void*不行)

#include<stdio.h>
#include<stdlib.h>
int main(){
    char* p = (char*)0x100;/*野指针,但只要不解引用就没事*/
    printf("%p\n", p+1);

    int* t = (int*)0x200; 
    printf("%p\n", t + 1);

    system("pause");
    return 0;
}

技术分享图片

 

指针+1相当于地址向后跳过一个元素,

看指针的类型,如果是char,地址+1;

如果是short类型,地址+2;如果是int类型,地址+4;

#include<stdio.h>
#include<stdlib.h>
int main(){
    int arr[4] = { 1, 2, 3, 4 };
    int* p = &arr[0];
    printf("%d\n", arr[1]);
    printf("%d\n", *(p+1));
    printf("%d\n", p[1]);
    system("pause");
    return 0;
}

技术分享图片

 

扩展:

1.数组作为函数参数时会隐式转为指针

2.数组名直接printf打印也会隐式转为指针

3.数组名参与算术运算也会隐式转为指针

4.*(p+1)和p[1]等价,可以理解成p[1]是*(p+1)的简化

 

 指针-指针(void*不行)(不能指针+指针)

#include<stdio.h>
#include<stdlib.h>
int main(){
    int arr[4] = { 1, 2, 3, 4 };
    int* p1 = &arr[0];
    int* p2 = &arr[2];
    int ret = p2 - p1;
    printf("%p %p\n", p1, p2);
    printf("ret=%d\n", ret);
    system("pause");
    return 0;
}

技术分享图片

 

指针相减本质上就是算两个指针之间隔了几个元素(和指针类型相关)

指针相减其实是指针+-整数的逆运算

指针相减一般是没有意义的,要是要有意义,要满足两个条件:

1.两个指针的类型相同.

2.两个指针必须要指向同一个连续的内存空间(同一个数组,malloc)  

 

指针的关系运算

 

==

!=

针对比较指针大小一般没有意义(比较地址数值大小)

要是要有意义,要满足两个条件:

1.两个指针的类型相同.

2.两个指针必须要指向同一个连续的内存空间(同一个数组,malloc)  

<

<=

>

>=

 

扩展知识:

C语言中,比较两个字符串,有两种方式

1.==比较字符串的身份/地址(是不是同一个字符串变量)

2.strcmp比较字符串的内容(字符串里面每个字符是不是依次相同)

strcmp(str1,str2) == 0    则两个字符串相等

一般常见的编程语言中,字符串==都是在比较内存,有两个例外:

1.C语言    2.Java   是比较地址

strcmp除了能比较字符串相等之外,还能比较字符串大小.

比较规则:先看第一个字符ASCII值的大小.如果能分出大小,结果就确定了.

如果第一个字符相同,依次比较下一个字符的ASCII.

strcmp(str1,str2)

如果 str1 小于 str2 返回一个 <0 的整数

如果 str1 大于 str2 返回一个 >0 的整数

 

指针数组:是一个数组,数组中的每一个元素又是一个指针变量.(实用)

int* arr[4] = { 0 };

数组指针:是一个指针.(不实用)

int(*arr)[4] = NULL;

 

const与指针搭配时: (背下来)

const int* p 限制根据指针修改对应的内存

int const* p 限制根据指针修改对应的内存

int* const p 限制修改指针的指向

 

 

#include<stdio.h>
#include<stdlib.h>
int main(){
    int arr[] = { 1, 2, 3, 4 };
    printf("%d\n", sizeof(arr));
    /*16*/
    printf("%d\n", sizeof(arr+0));
    /*数组名参与算术运算也会隐式转为指针,指针大小为4个字节*/
    printf("%d\n", sizeof(arr+1));
    /*数组名参与算术运算也会隐式转为指针,指针大小为4个字节*/
    printf("%d\n", sizeof(*arr));
    //得到首元素int,大小为4个字节
    printf("%d\n", sizeof(&arr));
    //数组指针,指针大小为4
    printf("%d\n", sizeof(&arr+1));
    //数组指针,指针大小为4
    printf("%d\n", sizeof(*&arr));
    //数组指针解引用得到数组 16
    printf("%d\n", sizeof(&*arr));
    //针对一个int取地址,得到一个int*  4
    printf("%d\n", sizeof(&arr[0]+1));
    /*int*   4*/
    system("pause");
    return 0;
}

 

指针2

原文:https://www.cnblogs.com/enjoyC/p/14590534.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!