目錄
前言
本篇博客主要是初始指標,簡單使用指標,在日常的使用解決問題中運用指標,
一. 指標是什么?
二. 指標和指標型別
2.1 指標的解參考
2.2 指標+-整數
三. 野指標
3.1 野指標成因
1. 指標未初始化
2. 指標越界訪問
?
3. 指標指向的空間釋放
3.2 如何規避野指標
四. 指標運算
4.1 指標+-整數
4.2 指標-指標
舉例2:求字串的長度
4.3 指標的關系運算
?
五. 指標和陣列
六. 二級指標
?
七. 指標陣列
總結
前言
本篇博客主要是初始指標,簡單使用指標,在日常的使用解決問題中運用指標,
提示:以下是本篇文章正文內容
一. 指標是什么?
指標:是記憶體單元的編號,也就是指標,
記憶體單元 - 編號 - 地址 - 指標
平時口語中的指標是指標變數,是存放記憶體變數的
記憶體被劃分為一個個小的記憶體單元 一個基本的記憶體單元的大小是一個位元組
地址: 記憶體單元的編號 0X00000000
記憶體單元編號的產生: 32位機器-32跟地址線-物理的電線- 通電-1/0
00000000 00000000 00000000 00000000 -- 4個位元組
00000000 00000000 00000000 00000001
00000000 00000000 00000000 00000010
.... ... ... ...
11111111 11111111 11111111 11111111
2*10^32 bite -- 4GB
64位
int main()
{
int a = 10;// 四個位元組
int* pa = &a;//pa存的是地址 所以pa就是指標變數
printf("%d\n", sizeof(pa));
printf("%p", &a);
return 0;
}
下面這張圖可便于大家理解:

舉例:
int main()
{
int a = 0x11223344;
int* pa = &a;
*pa = 0;
//char* pc = &a;
//*pc = 0;
//int* --> 4
//char* --> 1
//double* --> 8
return 0;
}
地址的列印:

二. 指標和指標型別
int main()
{
int a = 10;
int* pa = &a;//整形 --4
char* pc = &a;//字符 --1
printf("%p\n", pa);
printf("%p\n", pa+1);
printf("%p\n", pc);
printf("%p\n", pc+1);
//指標型別決定了指標向前或者向后走一步走的距離 -- 單位是位元組
return 0;
}
指標型別決定了指標向前或者向后走一步走的距離 -- 單位是位元組

2.1 指標的解參考


2.2 指標+-整數


總結:指標的型別決定了指標向前或者向后走一步有多大(距離)
舉例:

分析:

int main()
{
int arr[10] = { 0 };
int* p = arr;
int i = 0;
for (i = 0; i < 10; i++)
{
//正著初始化
*(p+i) = i+1;
}
//正著列印
int* m = &arr[0];
for (i = 0; i < 10; i++)
{
printf("%d ", *m);
m++;
}
printf("\n");
//倒著列印 9 8 7 ...
int* q = &arr[9];
for (i = 0; i < 10; i++)
{
printf("%d ", *q);
q--;
}
return 0;
}
演示分析:



三. 野指標
概念: 野指標就是指標指向的位置是不可知的(隨機的、不正確的、沒有明確限制的)
3.1 野指標成因
1. 指標未初始化
int main()
{
int* p;//區域變數指標未初始化,默認為隨機值
*p = 20;
return 0;
}
2. 指標越界訪問
int arr[10] = { 0 };
int* p = arr;
for (int i = 0; i <= 10; i++)
{
*p = i;
p++;
}
3. 指標指向的空間釋放
//指標指向的空間釋放
int* test()
{
int a = 100;
return &a;
}
int main()
{
int* p = test();
printf("%d", *p);
return 0;
}
int main()
{
int a = 10;
int* pa = &a;// 知道存給誰
int* p = NULL;//初始化成空指標
if (p != NULL)
{
}
return 0;
}
分析:

3.2 如何規避野指標

四. 指標運算
4.1 指標+-整數
初始化并賦值列印
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+1;
}
//列印
for (i = 0; i < sz; i++)
{
printf("%d ", *(p + i));
}
return 0;
}
4.2 指標-指標
int main()
{
/*int a[10] = { 0 };
printf("%d\n", &a[9] - &a[0]);
printf("%d\n", &a[0] - &a[9]);*/
int a = 10;
char c = 'w';
return 0;
}
分析:

![]()
舉例2:求字串的長度
在之前我們用strlen函式寫了可以求字串的長度
//求字串長度的函式 strlen
#include <string.h>
int My_strlen(char* s)
{
int count = 0;
while(*s != '\0')
{
count++;
s++;
}
return count;
}
int main()
{
char arr[] = "abc";
int len =My_strlen(arr);
printf("%d\n", len);
return 0;
}
同樣我們也可以使用指標減指標的方法
int My_strlen(char* s)
{
char* start = s;
while (*s != '\0')
{
s++;
}
return s - start;
}
int main()
{
char arr[] = "abc";
int len =My_strlen(arr);
printf("%d\n", len);
return 0;
}
分析:

4.3 指標的關系運算
int main()
{
float a[5];
float* p;
for (p = &a[5]; p >= &a[0];)
{
*--p = 0;
}
return 0;
}


改進:
for (p = &a[4]; p >= &a[0]; p--)
{
*p = 0;
}


五. 指標和陣列
指標 -- 地址
陣列 -- 一組相同型別的資料
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//arr首元素地址
int* p = arr;
int i = 0;
for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
{
printf("%p == %p \n", p + i,&arr[i]);
}
return 0;
}
分析:


int arr [ 10 ] = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 };int * p = arr ; //p 存放的是陣列首元素的地址
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 = %p\n", i, &arr[i], i, p + i);
}
return 0;
}
所以 p+i 其實計算的是陣列 arr 下標為i的地址
六. 二級指標
int main()
{
int a = 10;
int* pa = &a;
int** ppa = &pa; //ppa就是一個二級指標
**ppa = 20;
printf("%d\n",a);
return 0;
}

七. 指標陣列
int main()
{
int arr[10];//整形陣列
char ch[5];//字符陣列
//指標陣列 --- 存放指標的陣列
int a = 10;
int b = 20;
int c = 30;
int* arr2[5] = {&a,&b,&c};//存放整形指標的陣列
int i = 0;
for (i = 0; i < 3; i++)
{
printf("%d ", *(arr2[i]));
}
return 0;
}


總結
本篇文章大致總結了指標在日常學習中的簡單使用,如果看完對大家有所幫助的話,希望大家點贊收藏+關注,感謝各位大佬們的支持,若文章出現錯誤,也請大佬們及時指正,
最后附上完整板書:2021_12_28 指標/指標.png · 李興宇/C語言 - Gitee.com
全部代碼:2021_12_28 指標/2021_12_28 指標/test.c · 李興宇/C語言 - Gitee.com
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/397355.html
標籤:其他



