0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

C語(yǔ)言-一維指針定義與使用

DS小龍哥-嵌入式技術(shù) ? 來(lái)源:DS小龍哥-嵌入式技術(shù) ? 作者:DS小龍哥-嵌入式技 ? 2022-08-14 10:02 ? 次閱讀

1. 前言

指針在很多書(shū)本上都是當(dāng)做重點(diǎn)來(lái)介紹,作為C語(yǔ)言的靈魂,項(xiàng)目里指針無(wú)處不在。

比如: 指針作為函數(shù)形參的時(shí)候,可以間接修改源地址里的數(shù)據(jù),也就相當(dāng)于解決了函數(shù)return一次只能返回一個(gè)值的問(wèn)題。

指針在嵌入式、單片機(jī)里使用最直觀,可以直接通過(guò)指針訪問(wèn)寄存器地址,對(duì)寄存器進(jìn)行配置;計(jì)算機(jī)的CPU、外設(shè)硬件都是依靠地址操作的。

2. 指針變量如何定義?

#include 
#include 
int main()
{
	char *p1;  //定義一個(gè)char類(lèi)型的指針變量
	int *p2;   //定義一個(gè)int類(lèi)型的指針變量
	//int類(lèi)型的指針變量: 存放地址數(shù)據(jù)。
	
	int data=123; //定義一個(gè)int類(lèi)型的變量
	//int類(lèi)型的變量: 存儲(chǔ)整數(shù)數(shù)據(jù)。
	return 0;
}

3. 指針如何使用?

#include 
#include 
int main()
{
	// &data  取地址    a&b 按位與   a&&b  并且
	// int *p 定義一個(gè)int類(lèi)型的指針
	// *p  取出指針指向空間中的數(shù)據(jù)--取數(shù)據(jù)
	// a*b a和b乘法
	
	int *p; //指針變量本身就是存放地址的
	int data=123; 
	//p=data; //錯(cuò)誤:data本身只是一個(gè)變量標(biāo)識(shí)符,不是地址
    p=&data;  //將data的地址賦值給指針p
	
	printf("*p=%d\n",*p); //取出指針p指向空間中的數(shù)據(jù)
	*p=666; //給指針指向的空間賦值
	printf("data=%d\n",data);
	return 0;
}

4. 什么是野指針?

野指針就是本身沒(méi)有合法地址空間—非法指針。

野指針會(huì)導(dǎo)致的常見(jiàn)錯(cuò)誤:段錯(cuò)誤。

下面代碼就會(huì)導(dǎo)致段錯(cuò)誤:

#include 
#include 
int main()
{
	int *p;//指針只能存放地址
	*p=123;
	printf("*p=%d\n",*p);
	return 0;
}

5. 指針本身占的空間是多少?

所有指針類(lèi)型都占4個(gè)字節(jié)空間。和類(lèi)型沒(méi)有關(guān)系。

#include 
#include 
int main()
{
	int *int_p;//指針只能存放地址
	int int_a;
	char *char_p;//指針只能存放地址
	char char_a;
	float *float_p;//指針只能存放地址
	float float_a;
	double *double_p;//指針只能存放地址
	double double_a;
	printf("int_a=%d\n",sizeof(int_a));//4
	printf("int_p=%d\n",sizeof(int_p));//4
	
	printf("char_a=%d\n",sizeof(char_a));
	printf("char_p=%d\n",sizeof(char_p));
	
	printf("float_a=%d\n",sizeof(float_a));
	printf("float_p=%d\n",sizeof(float_p));
	
	printf("double_a=%d\n",sizeof(double_a));
	printf("double_p=%d\n",sizeof(double_p));
	return 0;
}

6. 指針訪問(wèn)數(shù)組成員

6.1 訪問(wèn)一維數(shù)組成員的方式有哪些?

#include 
#include 
int main()
{
	int a[]={1,2,3,4,5,6,7,8,9,0};
	int *p;
	p=a;
	printf("下標(biāo)4的值:%d\n",a[4]); //5
	printf("下標(biāo)4的值:%d\n",*(a+4)); //5
	printf("下標(biāo)4的值:%d\n",*(p+4)); //5
	return 0;
}

6.2 指針訪問(wèn)一維數(shù)據(jù)常用的操作方式:字符串

#include 
#include 
int main()
{
	char str[]="1234567890";
	char *p=str;
	int len=0;
	printf("p=%s,str=%s\n",p,str);
	//計(jì)算字符串的長(zhǎng)度
	while(*p++!='\0')
	{
		len++;
	}
	printf("len=%d\n",len);
	return 0;
}

6.3 指針自增和自減?++和—運(yùn)算符

#include 
#include 
int main()
{
	int a[]={1,2,3,4,5,6,7,8,9,0};
	int *p=a;
	printf("%d\n",*p);   //1
	printf("%d\n",*p++); //1
	printf("%d\n",*p);   //2
	printf("%d\n",*(p+3));//5
	printf("%d\n",*p);//2
	printf("%d\n",*(++p));//3
	printf("%d\n",*p);//3
	printf("%d\n",*p--);//3
	printf("%d\n",*p);//2
	return 0;
}

6.4 指針自增自減偏移字節(jié)是多少?

與指針本身的類(lèi)型有關(guān)系。

#include 
#include 
int main()
{
	/*
	int a[]={1,2,3,4,5,6,7,8,9,0};
	int *p=a;
	printf("偏移之前的地址:p=%#x\n",p);
	*(p++);
	printf("%d\n",*p);   //2
	printf("偏移之后的地址:p=%#x\n",p);
	*/
	char a[]={1,2,3,4,5,6,7,8,9,0};
	char *p=a;
	printf("偏移之前的地址:p=%#x\n",p);
	*(p++);
	printf("%d\n",*p);   //2
	printf("偏移之后的地址:p=%#x\n",p);
	return 0;
}

6.5 數(shù)組本身可以當(dāng)做指針使用嗎?

不可以

指針特點(diǎn): 自增、自減、可以改變指向。

#include 
#include 
int main()
{
	int a[]={1,2,3,4,5}; //*(a+3)
	int b[]={11,12,13,14,15};
	//下面3行代碼是錯(cuò)誤的
	a--;
	a++;
	a=b;
	return 0;
}

6.6 指針可以當(dāng)做數(shù)組使用嗎?

可以

數(shù)組特點(diǎn): 可以通過(guò)下標(biāo)訪問(wèn)數(shù)組成員。

#include 
#include 
int main()
{
	int a[]={1,2,3,4,5};
	int *p=a;
	printf("%d\n",a[0]);
	printf("%d\n",p[0]); //*p
	return 0;
}

7. 數(shù)組指針

數(shù)組指針可以指向一個(gè)一維數(shù)組,行指針也叫一維數(shù)組指針。

定義語(yǔ)法:char (*p)[5]; 該指針指向一個(gè)二維數(shù)組里的一個(gè)一維數(shù)組地址,一維數(shù)組的成員是5個(gè)字節(jié)。

二維數(shù)組的定義方法:char a[10][5];

#include 
#include 
int main()
{
	int (*p)[5]; //定義一個(gè)一維數(shù)組指針---行指針
	int a[2][5]=
	{
		{1,2,3,4,5},
		{6,7,8,9,10}
	};
	p=a; //將a地址給p指針
	printf("%d\n",p[0][2]);
	
	p++; //加一個(gè)一維數(shù)組的大小
	printf("%d\n",p[0][2]);
	return 0;
}

8. 指針數(shù)組

指針數(shù)組: 表示該數(shù)組成員可以存放指針。

指針數(shù)組定義語(yǔ)法:int *p[5];表示定義一個(gè)int數(shù)組,該數(shù)組的類(lèi)型可以存放5個(gè)int類(lèi)型的指針變量(地址)。

#include 
#include 
int main()
{
	int a,b,c;
	int *p[3]; //一次定義3個(gè)int類(lèi)型的指針變量
	//存放地址
	p[0]=&a;
	p[1]=&b;
	p[2]=&c;
	//對(duì)空間賦值
	*p[0]=123;
	*p[1]=456;
	*p[2]=789;
	//取出數(shù)據(jù)
	printf("%d\n",*p[0]);
	printf("%d\n",*p[1]);
	printf("%d\n",*p[2]);
	return 0;
}

#include 
#include 
int main()
{
	char a[][100]={"小明","小白","小李"};
	char *p[]={"小明","小白","小李"};
	
	printf("%s\n",a[0]);
	printf("%s\n",p[0]);
	return 0;
}

9. 指針類(lèi)型常見(jiàn)的初始化值:NULL

#include 
#include 
int main()
{
	char *p=NULL; // (void*)0 == NULL
	printf("%#x\n",p);
	if(p!=NULL)
	{
		//判斷指針是否可以使用
	}
	return 0;
}
審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5088

    文章

    19159

    瀏覽量

    306515
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    180

    文章

    7614

    瀏覽量

    137266
  • 指針
    +關(guān)注

    關(guān)注

    1

    文章

    480

    瀏覽量

    70585
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    C語(yǔ)言中指針定義

    節(jié)中,我們利用了個(gè)小知識(shí)來(lái)介紹了指針,在上面這個(gè)例子中,小明和小麗手中的這個(gè)杯子就好比我們C語(yǔ)
    發(fā)表于 08-15 16:24 ?1843次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言中指針</b>的<b class='flag-5'>定義</b>

    大話指針變量的定義

    b),返回值為int,要指向其他類(lèi)型的函數(shù),可以照此方法類(lèi)推,同樣我想把二數(shù)組名存到指針變量,我們知道二數(shù)組名是個(gè)數(shù)組指針,所以我們
    發(fā)表于 09-24 01:01

    文徹底搞懂C語(yǔ)言指針

    相似,二數(shù)組名是個(gè)指向整個(gè)二數(shù)組首地址的指針,但是它的類(lèi)型不再是int類(lèi)型指針,而是int類(lèi)型數(shù)組
    發(fā)表于 07-22 14:48

    C51語(yǔ)言指針、結(jié)構(gòu)、聯(lián)合和枚舉

     指針C51語(yǔ)言的精華也是難點(diǎn)。本章主要介紹指針的概念、定義指針的方法,介紹指向
    發(fā)表于 06-12 23:47 ?112次下載

    C語(yǔ)言入門(mén)教程-指針

    指針C語(yǔ)言中,指針被廣泛使用。所以要想完整地掌握C語(yǔ)言,您需要對(duì)
    發(fā)表于 07-29 11:30 ?674次閱讀

    C語(yǔ)言入門(mén)教程-指向結(jié)構(gòu)體的指針

    指向結(jié)構(gòu)體的指針C語(yǔ)言中幾乎可以創(chuàng)建指向任何類(lèi)型的指針,包括用戶(hù)自定義的類(lèi)型。創(chuàng)建結(jié)構(gòu)體指針
    發(fā)表于 07-29 12:04 ?3162次閱讀

    C語(yǔ)言指針電子教程

    本資料是份不錯(cuò)的關(guān)于C語(yǔ)言指針的電子教程,希望對(duì)大家有所幫助... 指針簡(jiǎn)介 指針
    發(fā)表于 07-30 16:00 ?77次下載

    C語(yǔ)言指針函數(shù)和函數(shù)指針詳細(xì)介紹

    C語(yǔ)言指針函數(shù)和函數(shù)指針詳細(xì)介紹。。。。。。。
    發(fā)表于 03-04 15:27 ?5次下載

    c語(yǔ)言函數(shù)指針定義,指針函數(shù)和函數(shù)指針的區(qū)別

     往往,我們提到指針函數(shù)和函數(shù)指針的時(shí)候,就有很多人弄不懂。下面就由小編詳細(xì)為大家介紹C語(yǔ)言中函數(shù)指針
    發(fā)表于 11-16 15:18 ?3630次閱讀

    C語(yǔ)言的精髓——指針詳解

    C語(yǔ)言的精髓——指針詳解
    發(fā)表于 11-30 14:43 ?17次下載

    C語(yǔ)言教程之指針定義及特點(diǎn)(上篇)

    int (*p)[n];p為指向含n個(gè)元素的數(shù)組的指針變量 int f();f為帶回整型函數(shù)值的函數(shù) int *p();p為帶回個(gè)指針
    發(fā)表于 05-22 07:28 ?2537次閱讀

    10分鐘掌握C語(yǔ)言指針

    說(shuō)到指針,估計(jì)還是有很多小伙伴都還是云里霧里的,有點(diǎn)知其然,而不知其所以然。但是,不得不說(shuō),學(xué)了指針,C語(yǔ)言才能算是入門(mén)了。指針
    的頭像 發(fā)表于 11-04 16:37 ?1757次閱讀

    C語(yǔ)言中的野指針是怎么來(lái)的?

    、什么是野指針? 指針C語(yǔ)言的靈魂,同時(shí)也是很容易讓人犯錯(cuò)的重難點(diǎn),用錯(cuò)了指針將是
    的頭像 發(fā)表于 06-01 16:43 ?2577次閱讀

    c語(yǔ)言指針用法簡(jiǎn)單舉例 C51的指針概述

    指針C語(yǔ)言個(gè)特殊的變量,它存儲(chǔ)的數(shù)值被解釋成為內(nèi)存的個(gè)地址。 指針
    的頭像 發(fā)表于 04-22 18:04 ?4860次閱讀

    C語(yǔ)言進(jìn)階】C語(yǔ)言指針的高階用法

    C語(yǔ)言進(jìn)階】C語(yǔ)言指針的高階用法
    的頭像 發(fā)表于 08-31 13:24 ?2367次閱讀