国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C/C++ - C語言指針之必須要掌握的指針基礎知識

C語言指針之必須要掌握的指針基礎知識

2022-01-12 14:08程序里的酒 C/C++

這篇文章主要介紹了C語言指針必須要掌握的基礎知識,文中實例講解的很清晰,有不太懂的同學可以研究下,希望能夠給你帶來幫助

一、指針概述

指針是個變量,存放內存單元的地址(編號)。

指針的創建

在定義指針變量的時候,在變量前面加上' * ',代表這個變量是一個指針,再往前面加上一個類型名,就代表指針的類型,稱為XX指針。

指針的初始化:

使用&(取地址操作符)可以獲得變量的地址,將其賦值給已經定義好的指針變量,需要它們的類型相同,類型不同的時候可以使用強制轉換。如果暫時不知道需要存放什么地址的時候,可以先讓它指向NULL((void*)0),NULL本質就是0,0這個地址是不允許存儲的。

#include <stdio.h>
int main()
{
	int a = 10;//在內存中開辟一塊空間
	int *p = &a;//這里我們對變量a,取出它的地址,可以使用&操作符。
				//將a的地址存放在p變量中,p就是一個指針變量。
	return 0;
}

指針的大小

指針可以是不同的類型,char*、int*、float*、double*、long*等我們熟知的類型,那指針在內存中占多大的空間呢?

對于32位的機器,假設有32根地址線,那么假設每根地址線在尋址的是產生一個電信號正電/負電(1或者0)
那么32根地址線產生的地址就會是:

00000000 00000000 00000000 00000000
……
111111111 111111111 111111111 111111111
共有232個地址,每一個地址能指向一個內存單元(一字節),那么有232個內存單元。

我們知道一個內存單元的大小為一字節,一根地址線是32位01組成的,那么要存放指針(地址),也就需要32個bit,也即4字節。所以在32位平臺下不論是什么類型的指針都是4個字節。

同理,在64位平臺下有64根地址線,每個地址是64位,所以需要8個字節。

如何使用指針

使用' * '操作符對指針進行解引用,可以獲取到指針指向空間的值

我們來運行下方代碼。

#include <stdio.h>
int main()
{
	int n = 0x11223344;
	char* pc = (char*)&n;//將n的地址(指針)強制轉換成char* 類型
	int* pi = &n;
	*pc = 0;//改變它指向空間的值
	*pi = 0;
	return 0;
}

我們開始調試代碼,查看n的內存,最左邊是地址,右邊是以16進制顯示內存里存放的數據,而n也是以16進制存進去的,兩個16進制代表一個字節,如下圖:

C語言指針之必須要掌握的指針基礎知識

當執行完語句 *pc=0;

C語言指針之必須要掌握的指針基礎知識

因為pc指向的是char* 類型,只能訪問一個字節,所以只能修改一個字節。

再執行*pi = 0;

C語言指針之必須要掌握的指針基礎知識

此時n的內存數據全部變成了0,說明int*類型的指針可以訪問4個字節。

小結:

指針的類型決定了,對指針解引用的時候有多大的權限(能操作幾個節)。 比如: char* 的指針解引用就只能訪問一個字節,而 int* 的指針的解引用就能訪問四個字節。

二級指針

指針變量也是變量,是變量就有地址,那指針變量的地址存放在哪里? 這就是 二級指針 。
即存放指針變量的地址的指針,二級指針指向的空間的值是一個一級指針。

int main()
{
	int a = 20;
	int* p = &a;
	int** pp = &p;
	printf("%d\n", *p);//解引用即可拿到指針指向空間里面的值
	printf("%d\n", *p); //對二級指針,需要兩次解引用才能拿到最開始的值
	return 0;
}

C語言指針之必須要掌握的指針基礎知識

C語言指針之必須要掌握的指針基礎知識

 

二、野指針

野指針就是指針指向的位置是不可知的(隨機的、不正確的、沒有明確限制的)。

形成野指針的原因

1.指針未初始化

#include <stdio.h>
int main()
{
	int *p;//局部變量指針未初始化,默認為隨機值
	*p = 20;//往一個隨機的地址(不屬于本程序的空間)里面放入數據,是不允許的
	return 0;
}

2.指針越界訪問

指針想要訪問不屬于本程序的空間,造成越界訪問,程序出錯,在使用數組的時候最容易發生。

#include <stdio.h>
int main()
{
	int arr[10] = {0};
	int *p = arr;
	int i = 0;
  for(i=0; i<=11; i++)
	{
		//當指針指向的范圍超出數組arr的范圍時,p就是野指針
  	*(p++) = i;
	}
	return 0;
}

3.指針指向的空間釋放

當動態開辟的內存被釋放后,此時的指針就屬于野指針,它指向的位置它不能正常訪問。關于動態內存分配,后續會細講。

int main()
{
	//開辟一個整形空間
	int* p = (int*)malloc(sizeof(int));
	//釋放該空間
	free(p);
	//此時p即為野指針,因為它指向的空間已經無法訪問,一般需要將其置空
	//將其指向空指針,防止后續調用出錯
	p = NULL;
	return 0;
}

如何規避野指針

  • 指針初始化
  • 小心指針越界
  • 指針指向空間釋放即使置NULL
  • 指針使用之前檢查有效性

 

三、指針的基本運算

關于指針的運算一般有兩個,指針+指針,語義是合法,但沒有意義。

  • 指針± 整數
  • 指針-指針

指針± 整數

對int和char類型的指針分別進行+1操作,%p以16進制打印

int main()
{
	int n = 10;
	char* pc = (char*)&n;//將n的地址(指針)強制轉換成char* 類型
	int* pi = &n;
	printf("&n:    %p\n", &n);
	printf("pc:    %p\n", pc);
	printf("pc + 1:%p\n", pc + 1);
	printf("pi:    %p\n", pi);
	printf("pi + 1:%p\n", pi + 1);
	return 0;
}

C語言指針之必須要掌握的指針基礎知識

小結:

指針的類型決定了指針向前或者向后走一步有多大(距離)。

指針-指針

int main()
{
	int n = 10;
	char* pc = (char*)&n;//將n的地址(指針)強制轉換成char* 類型
	int* pi = &n;
	printf("&n:    %p\n", &n);
	printf("pc:    %p\n", pc);
	printf("pc + 1:%p\n", pc + 1);
	printf("pi:    %p\n", pi);
	printf("pi + 1:%p\n", pi + 1);
	return 0;
}

C語言指針之必須要掌握的指針基礎知識

小結:

指針-指針等于它們之間相差的類型數據的個數。即本例的第10個元素和第1個元素之間相差9。

 

四、指針和數組

一起來看一下數組名是什么

#include <stdio.h>
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,0 };
	printf("%p\n", arr);
	printf("%p\n", &arr[0]);
	return 0;
}

C語言指針之必須要掌握的指針基礎知識

可見數組名和數組首元素的地址是一樣的。

結論: 數組名表示的是數組首元素的地址。也是一個指針

那么我們就可以用一個指針來代替數組名,如下代碼:

int main()
{
	int arr[10] = { 0 };
	int* p = arr;
	int i = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);//計算數組元素個數
	//對數組賦值
	for (i = 0; i < sz; i++)
	{
		*(p + i) = i;
	}
	//打印數組數據
	for (i = 0; i < sz; i++)
	{
		printf("%d ", *(p + i));
	}
	return 0;
}

C語言指針之必須要掌握的指針基礎知識

注意:

數組名在下面兩種情況下不是首元素的地址

1.sizeof(數組名) - 這里的數組名不是首元素的地址,是表示整個數組的,這里計算的是整個數組的大小,單位還是字節

2.&數組名 - 這里的數組名不是首元素的地址,是表示整個數組的,拿到的是整個數組的地址

int main()
{
	int arr[10] = { 0 };
	int sz = sizeof(arr);
	printf("sizeof(arr)計算的是整個數組的大小:%d\n", sz);
	printf("數組首地址:      %p\n", arr);
	printf("數組首元素地址:  %p\n", &arr[0]);
	printf("數組的地址:      %p\n", &arr);
	printf("數組首地址+1:    %p\n", arr + 1);
	printf("數組首元素地址+1:%p\n", &arr[0] + 1);
	printf("數組的地址+1:    %p\n", &arr + 1);
	//數組名確實是首元素的地址
	//但是有2個例外:
	//1. sizeof(數組名)  - 這里的數組名不是首元素的地址,是表示整個數組的,這里計算的是整個數組的大小,單位還是字節
	//2. &數組名 - 這里的數組名不是首元素的地址,是表示整個數組的,拿到的是整個數組的地址
	//
	return 0;
}

C語言指針之必須要掌握的指針基礎知識

 

五、指針數組

存放指針的數組。

int main()
{
	int a = 1;
	int b = 2;
	int c = 3;
	int* arr[10] = { &a,&b,&c };
	for (int i = 0; i < 3 ; i++)
	{
		printf("%d ", *(arr[i]));
	}
	return 0;
}

C語言指針之必須要掌握的指針基礎知識

 

總結

指針是C語言非常重要的一部分,內容繁多不易懂,本文僅介紹了一些基本知識,后續還會深入了解指針。

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注服務器之家的更多內容!

原文鏈接:https://blog.csdn.net/qq_52145272/article/details/120474039

延伸 · 閱讀

精彩推薦
  • C/C++C/C++經典實例之模擬計算器示例代碼

    C/C++經典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關于C/C++經典實例之模擬計算器的相關資料,文中通過示...

    jia150610152021-06-07
  • C/C++深入理解goto語句的替代實現方式分析

    深入理解goto語句的替代實現方式分析

    本篇文章是對goto語句的替代實現方式進行了詳細的分析介紹,需要的朋友參考下...

    C語言教程網7342020-12-03
  • C/C++C語言實現電腦關機程序

    C語言實現電腦關機程序

    這篇文章主要為大家詳細介紹了C語言實現電腦關機程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xiaocaidayong8482021-08-20
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數使用

    詳解c語言中的 strcpy和strncpy字符串函數使用

    strcpy 和strcnpy函數是字符串復制函數。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數使用,感興趣的朋友跟隨小編要求看看吧...

    spring-go5642021-07-02
  • C/C++C++之重載 重定義與重寫用法詳解

    C++之重載 重定義與重寫用法詳解

    這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下...

    青山的青6062022-01-04
  • C/C++c++ 單線程實現同時監聽多個端口

    c++ 單線程實現同時監聽多個端口

    這篇文章主要介紹了c++ 單線程實現同時監聽多個端口的方法,幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下...

    源之緣11542021-10-27
  • C/C++學習C++編程的必備軟件

    學習C++編程的必備軟件

    本文給大家分享的是作者在學習使用C++進行編程的時候所用到的一些常用的軟件,這里推薦給大家...

    謝恩銘10102021-05-08
  • C/C++C語言中炫酷的文件操作實例詳解

    C語言中炫酷的文件操作實例詳解

    內存中的數據都是暫時的,當程序結束時,它們都將丟失,為了永久性的保存大量的數據,C語言提供了對文件的操作,這篇文章主要給大家介紹了關于C語言中文件...

    針眼_6702022-01-24
主站蜘蛛池模板: 亚洲精品视频在线观看免费视频 | 亚洲精品久久久一区二区三区 | 日韩免费在线观看视频 | 欧美日韩免费在线 | 日本一区二区精品视频 | 国产毛片18片毛一级特黄日韩a | 久久精品国产99 | 怡红院成人影院 | 日本免费三片免费观看 | av在线免费网址 | 日韩av电影在线观看 | 男人的天堂久久 | 玖玖综合网| 麻豆一区 | 日韩欧美国产一区二区 | 九九九久久国产免费 | 一本色道精品久久一区二区三区 | 精品国产免费看 | 精品国产乱码久久久久久密桃99 | 亚洲高清视频网站 | 午夜成人免费视频 | 久久高清精品 | 日本www视频 | 成人欧美 | 亚洲最大的黄色网 | 亚洲欧美另类久久久精品2019 | 日本中文字幕一区 | 欧美自拍视频 | 婷婷成人基地 | 亚洲国产精品一区二区三区 | 中文字幕日韩欧美一区二区三区 | 不卡黄色片| a久久| 亚洲精品一区二区三区在线 | 国产成人天天爽高清视频 | 亚洲视频黄 | 色偷偷噜噜噜亚洲男人的天堂 | 欧美 日韩 综合 | 欧美精品免费在线 | 国产91对白叫床清晰播放 | 黄色一级毛片在线观看 |