c/c++语言开发共享C语言指针原来也可以这样了解

目录什么是指针指针是应该对象,可以直接指向电脑存储器中的某个地方,这个地方就是内存单元,指针指向的是一个对象的地址。地址的指向就是内存单元,一个内存单元是一个字节,在32位平台上面,一个指针是4个字节

目录

      什么是指针

      指针是应该对象,可以直接指向电脑存储器中的某个地方,这个地方就是内存单元,指针指向的是一个对象的地址。地址的指向就是内存单元,一个内存单元是一个字节,在32位平台上面,一个指针是4个字节。因为32位的平台有32根地址线,每根地址线是 1 bit,所以32位平台的指针大小是 4 个字节。同理,64位平台的指针大小就是 8 个字节。

      指针的应用

      指针用于指向某个对象的地址,也可以通过指针解引用来修改对象。

        int main()  {  	int a = 10;  	int* p = &a;			  	printf("%dn", *p);		//10  	return 0;  }  

      &a 就是把 a 的地址取出来。int* 说明 p 是指针变量,指向的对象是整型。所以 *p 指向的就是 a 的地址,打印出来也是10。因为 *p和 a 指向的是同一块内存,所以对 *p修改也就是对 a 的值进行修改。

        int main()  {  	int a = 10;  	int* p = &a;  	*p = 20;  	printf("%dn", a);		//20  	return 0;  }  

      这里就是通过 *p 对 a 的值进行修改。

      指针 ± 整数

      指针 + 指针

      指针指向的是一个对象。比如指针 + 1,就是指向后一个元素,拿数组举例。

        int main()  {  	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };  	printf("%dn", *arr);  	printf("%dn", *(arr + 1));  	printf("%dn", *(arr + 2));  	return 0;  }  

      C语言指针原来也可以这样了解

      从图片可知,指针每次 + 1,都会指向数组的下一个元素。如果是对数组取地址再 + 1的话,就会跳过整个数组,指向整个数组后面的地址。所以使用指针加减和取地址加减的时候,一定要注意。

      指针 – 指针

      指针 – 指针算的是两个指针之间的元素个数。

        int my_strlen(char* s)  {  	char* p = s;  	while (*p != '')  		p++;  	return p - s;  }  int main()  {  	char arr[10] = "abcdef";  	int ret = my_strlen(arr);  	printf("%dn", ret);			//6  	return 0;  }  

      算的结果是 6,因为指针相减,得到了差的元素个数。

      野指针

      野指针就是指针执行的位置使随机的,是没有被分配的内存空间。

      野指针成因

      野指针是由于指针未初始化,指针越界访问造成的。野指针也是经常导致程序崩溃的原因。

      指针未初始化

        int main()  {  	int* p;  	*p = 20;  	return 0;  }  

      这里的指针就没有初始化,没有初始化指向的内容,就是野指针,而且这里连编译也完成不了。

      指针越界访问

      指针越界访问是一件非常可怕的事情,会导致程序崩溃,程序死循环。

        int main()  {  	int i = 0;  	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };  	for (i = 0; i <= 12; i++)  	{  		arr[i] = 0;  		printf("hahan");  	}  	return 0;  }  

      上面这个代码就死循环了,因为指针越界访问,造成了死循环.这里是一个压栈的情况造成的。用下面这张图来解释:

      C语言指针原来也可以这样了解

      上面这张图就描述了这个死循环的过程。

      指针和数组

      数组名其实表示的就是首元素的地址,传参的时候传数组名就等于是传了数组的首元素地址。因为数组在内存当中是连续存储的,所以只要把首元素地址传过去就可以了。

        int main()  {  	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };  	printf("%pn", &arr[0]);  	printf("%pn", arr);  	return 0;  }  

      C语言指针原来也可以这样了解

      通过图片就可以看出。

      指针 ± 和数组的关系

      当指针 ± 的时候,解引用指向数组的元素也在发生改变,+1,表示向后移动一个元素。

        int main()  {  	int arr[] = { 1,2,3,4,5,6,7,8,9,0 };  	int* p = arr; //用指针来存放数组首元素的地址  	int sz = sizeof(arr) / sizeof(arr[0]);  	int i = 0;  	for (i = 0; i < sz; i++)  	{  		printf("&arr[%d] = %p   <====> p+%d = %pn", i, &arr[i], i, p + i);  	}  	return 0;  }  

      使用数组的时候,也可以换做指针来使用,看起来会整洁一些。

      二级指针

      因为指针变量也是变量,是变量就会有地址,那么指针变量的地址就可以用二级指针来描述。就是把一个变量的地址放在指针里面,然后再把指针的地址放在二级指针里面。所以就可以通过对二级指针解引用拿到一级指针的地址,对二级指针两次解引用,就拿到变量的地址了。

        int main()  {  	int a = 10;  	int* p = &a;  	int** pp = &p;  	printf("%pn", a);  	printf("%pn", *p);  	printf("%pn", **pp);  	return 0;  }  

      C语言指针原来也可以这样了解

      既然能拿到地址,那么对pp解引用之后修改,也就修改了a的值。

        int main()  {  	int a = 10;  	int* p = &a;  	int** pp = &p;  	**pp = 20;  	printf("%dn", a);  	return 0;  }  

      C语言指针原来也可以这样了解

      所以在使用二级指针的时候,也可以直接对变量进行修改。

      总结

      本篇文章就到这里了,希望能给你带来帮助,也希望能够您能够关注<计算机技术网(www.ctvol.com)!!>的更多内容!

      需要了解更多c/c++开发分享C语言指针原来也可以这样了解,都可以关注C/C++技术分享栏目—计算机技术网(www.ctvol.com)!

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/748581.html

      (0)
      上一篇 2021年8月13日
      下一篇 2021年8月13日

      精彩推荐