首页 > 其他分享 >指针

指针

时间:2023-08-12 14:34:20浏览次数:18  
标签:arr int 地址 64 数组 指针

> 指针就是地址,地址就是指针

int a = 1;
int *p;
p = &a;    //等价于int *p = &a
//p、&a是int*,*p、a是int
  • 指针变量也有地址,只是每次运行随机分配不固定!!!!
  • 指针变量++,类似于int a,a++。不会改变指针变量本身的地址,只会改变指针变量这块地址上存放的地址
  • 指针加减根据char* int* 程度不同,比如char* 一次就加1,因为字符占一个字节,所以指针存放的地址只需要+1即可
  • 指针相减的值等于地址差/指针类型字节,例如int* 的0x000004 - 0x000000,结果为1

> 字符串指针是最最最最特殊的!!

//一般情况
int arr[] = {1, 2, 3};
int *p = arr;  // 将指针指向数组的首地址
char *p = "abcdefg";
  • 正确,因为人家是关系户!!!tmd,注意不可以通过p改变字符串常量的地址就行,p存放该字符串(实际上是字符数组)首地址
  • 可以理解为“abcde”类型是const char*

image

> 数组名相关

int arr[10];
int *p = arr;
//arr + i == &arr[i] == p + i == &p[i]  都是地址!!!!!
//*(arr+i) == arr[i] == *(p+i) == p[i]  都是值!!!!也就是说,p就是arr了!!!
//&arr表示整个数组的地址,可以通过sizeof验证

int (*parr[10])(int ,int);
//表示存放了十个函数指针的数组,换句话说,就是一个数组,数组里存放的指针,怎么看出来的呢?*parr[10]!!!
什么指针呢?指向函数的指针!怎么看出来的呢? int *()是函数指针!

> 指针数组or数组指针?

image

image

总结:去掉指针变量得到指针的类型,再去掉 得到指针指向的数据的类型*

> 64位系统下指针为什么是八字节?

  • 因为64=64位2进制001010101010101...共64个 = 8字节,而且指针里存放的就是这样一个64位八进制数,占用8字节

> 野指针

image

  • 也可能是没有赋初值、数组越界、malloc使用后没有free并置空

>二维数组的数组名是指针吗?

int arr[3][5],arr 是一个指向一维数组的指针,即 int (*arr)[5],可以对其+1,表示指向下一行

&arr 是一个指向arr的指针,即 int (**p)[5]

* arr 是对arr解引用,表示一维数组,如*(arr+2)表示第二行等价于arr[2]!!!因此可以通过*(arr+2)+2读取arr[2][2];

int (p)[5] 和 intp[5]

int (*p)[5] 小括号优先,表示p是一个指针,指向int[5]的数组
int*p[5] 中括号优先,表示p是一个数组,数组中每个元素的类型都是int*

image

参数传递

int* arr[5] 作为入参时,arr会退化为首地址,地址也就是指针,所以可以作为int** 形参的入参 反之不可以!!!

int* p 和int arr[] 正反都可以做对方的入参

二维数组不可以省略列,即int arr[5][]是不可以的!!

我的主要误区解答!!不是带* 一定是解引用,也可以表示它是个指针变量!!!

函数指针

函数名、&函数名都可以表示函数的地址
image


image

标签:arr,int,地址,64,数组,指针
From: https://www.cnblogs.com/xsl-blogs/p/17623111.html

相关文章

  • 随笔-C-指针数组使用简记
    typedefstructmem_list*cns_detail_encode_result[encode_type_max];(gdb)p&((structmem_list**)0x7fffb4557950)[0]#&取对应点的位置$29=(structmem_list**)0x7fffb4557950(gdb)p((structmem_list**)0x7fffb4557950)+0$30=(structmem_list**)......
  • 有关成员函数const修饰,对传入的成员属性影响以及返回指针引用的bug问题
    boolcontains(_T&data,bn_ptrt)const 此时传入的成员参数是带有const属性的,但是data是不带const的,通过影响成员参数访问权限,而达到不能修改的目的;BinarySearchTree<_T>&BinarySearchTree<_T>::operator=(constbst_refbst){ if(this!=&bst) { makeEmpty(); ......
  • 学习《C和指针》的总结(1)
    一、GDB,我使用的是notepad++,因为它轻量化,再用MinGW作为编译器,配置宏:Compile、Run和GDB。GDB指令:1、b13 :在第十三行打断点2、r:运行代码到第十三行3、n:运行下一行代码4、s:如果下一行是调用函数,使用此指令进入调用函数5、pa:打印变量a的值,执行一次就打一次6......
  • C++11实用特性3 --智能指针
    1智能指针在C++中没有垃圾回收机制,必须自己释放分配的内存,否则就会造成内存泄露。解决这个问题最有效的方法是使用智能指针(smartpointer)。智能指针是存储指向动态分配(堆)对象指针的类,用于生存期的控制,能够确保在离开指针所在作用域时,自动地销毁动态分配的对象,防止内存泄露。智能......
  • C++ 初学者如何正确使用指针
    一、指针的基本概念指针是C++中非常重要的概念,也是初学者经常会遇到的问题。指针是一个存储变量地址的变量,它指向存储器中的一个地址。使用指针可以直接操作存储器中的数据,因此常用于处理复杂的数据结构和算法。二、指针的定义和使用定义指针以及使用指针的步骤如下:1......
  • Leetcode167. 两数之和 II - 输入有序数组(双指针)
    题目:两数之和II-输入有序数组(双指针)给你一个下标从1开始的整数数组numbers,该数组已按非递减顺序排列,请你从数组中找出满足相加之和等于目标数target的两个数。如果设这两个数分别是numbers[index1]和numbers[index2],则1<=index1<index2<=numbers.length......
  • C语言的指针
    所谓的指针,其实就是一个类型。如何解释这个呢?首先来看inti=3;int是变量的类型i是变量的名字3是变量的值首先变量是存储在内存中,访问内存是需要地址,其次读取时需要知道内存存储的格式后才知道读取多少位内存。也是分三步走确认内存地址知道内存格式读取内存此......
  • 函数指针、std::function、std::bind
    函数指针、std::function、std::bind函数指针:C++语法中可以直接将函数名作为指针,voidfun(inta,intb);在这个函数声明中,函数指针即为fun,传入要被调用的地方时只需要传入fun就可以。但是这个函数指针是什么类型呢?需要明确函数指针类型及其写法,我们才能在要调用函数的形......
  • C语言学习笔记(八)指针详解
    指针详解arr[i]=*(arr+i)=*(p+i)=p[i]字符指针charp*intmain(){ charch='w'; char*pc=&ch; return0;}intmain(){ chararr[]="abcdefg"; char*pc=arr; printf("%s\n",arr); printf("%s\n",pc); ......
  • LeetCode 16. 3Sum Closest 双指针+排序
    Givenanintegerarraynumsoflengthnandanintegertarget,findthreeintegersinnumssuchthatthesumisclosesttotarget.Returnthesumofthethreeintegers.Youmayassumethateachinputwouldhaveexactlyonesolution.Solution先将原数组排序,然......