声明为数组定义为指针,声明为指针定义为数组
導語
在這里我們做種強調的是在兩個文件中,定義為數組聲明為指針和定義為指聲明為數組的這輛中情況。那么我們就需要兩個源文件test.c和main.c。
定義為數組,聲明為指針
test.c
char arr[] = "abcdef";main.c
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h>extern char *arr; //聲明int main() {printf("%s\n", arr);system("pause");return 0; }就會出現以下的錯誤:
就會出現,讀取位置發生訪問沖突
首先我們需要知道的是定義和聲明使用的是同一塊空間,我們在test.c中定義為數組,在main.c中使用,不管聲明為數組還是指針都是用的是這一塊空間。這里將聲明的arr當為指針取出來的是四個字節的值,然后在打印字符串時,就會將這四個字節的值作為一個地址去尋找,我們可以先來看看代碼呈現。
我們會發現“64636261”不是dcba的ASSCII碼嗎?
所以我們就知道了它為何地址訪問出錯。看下圖:這里指針去訪問了四個字節的空間,然后取出了dcba,將dcba當做地址碼去取出字符,造成地址訪問出錯。那我們如何在定義為數組、聲明為指針的情況下,取出數組中所存的字符串?
要取出字符串,就必須知道首元素’a’的地址,上述的描述,不就讓我們知道了arr中存放的就是64636261相當于dcba,我們對arr取地址就相當于取到了abcd的地址,我們在對這個地址強制轉換為char*類型,不就取到了一個字節’a’的地址。字符串知道了首元素地址,打印就很方便啦!
main.c
#include <stdio.h>extern char *arr;int main() {//printf("%s\n", arr);printf("%s\n", (char*)&arr);system("pause");return 0; }定義為指針,聲明為數組
test.c
char *p = "abcdef";main.c
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdlib.h> #include <stdio.h>extern char arr[]; //這里只是說他是一個數組,不需要填寫數組個數int main() {printf("%s\n", p);system("pause");return 0; }運行之后就會發現,呀!我的程序運行出來是隨機值,不對呀,我明明將它存放進去了。
首先我們就得清楚這個數組里面存放的是什么?
定義為指針,然后指向了字符串”abcdef”,這里指針里面就存的是字符串首元素的地址
聲明為數組,定義為指針,大小只有四個字節,所以數組的大小也只有四個字節
指針中存放的是字符串首元素的地址,數組中存放的是字符串首元素的地址,所以打印出來就是亂碼了。
圖解如下圖所示:那我們如何在定義為指針、聲明為數組的情況下,取出指針中所指向的字符串?
我們要找到字符串,就要將指針所存放的四個字節一次取出來,因為字符數組一次只能讀一個字節,* 所以,我們需要把它強轉為int*
取出后,我們需要知道它里面的內容,就必須把它解引用,取出四個字節的地址,(int )p
最后,我們要找到’a’的地址,就必須強轉為char*,才能取出’a’的地址。main.c
總結:
定義和聲明使用的是同一塊空間
指針大小是4個字節,數組大小不一定
指針和數組不一樣
轉自:
https://blog.csdn.net/meng_lemon/article/details/80642938
? 回復「?籃球的大肚子」進入技術群聊
回復「1024」獲取1000G學習資料
總結
以上是生活随笔為你收集整理的声明为数组定义为指针,声明为指针定义为数组的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2022年下半年深圳地区数据分析师认证(
- 下一篇: Luyten报错:This applic