1. 前言
指針在很多書本上都是當做重點來介紹,作為C語言的靈魂,項目里指針無處不在。
比如: 指針作為函數形參的時候,可以間接修改源地址里的數據,也就相當于解決了函數return一次只能返回一個值的問題。
指針在嵌入式、單片機里使用最直觀,可以直接通過指針訪問寄存器地址,對寄存器進行配置;計算機的CPU、外設硬件都是依靠地址操作的。
2. 指針變量如何定義?
#include
#include
int main()
{
char *p1; //定義一個char類型的指針變量
int *p2; //定義一個int類型的指針變量
//int類型的指針變量: 存放地址數據。
int data=123; //定義一個int類型的變量
//int類型的變量: 存儲整數數據。
return 0;
}
3. 指針如何使用?
#include
#include
int main()
{
// &data 取地址 a&b 按位與 a&&b 并且
// int *p 定義一個int類型的指針
// *p 取出指針指向空間中的數據--取數據
// a*b a和b乘法
int *p; //指針變量本身就是存放地址的
int data=123;
//p=data; //錯誤:data本身只是一個變量標識符,不是地址
p=&data; //將data的地址賦值給指針p
printf("*p=%d\n",*p); //取出指針p指向空間中的數據
*p=666; //給指針指向的空間賦值
printf("data=%d\n",data);
return 0;
}
4. 什么是野指針?
野指針就是本身沒有合法地址空間—非法指針。
野指針會導致的常見錯誤:段錯誤。
下面代碼就會導致段錯誤:
#include
#include
int main()
{
int *p;//指針只能存放地址
*p=123;
printf("*p=%d\n",*p);
return 0;
}
5. 指針本身占的空間是多少?
所有指針類型都占4個字節空間。和類型沒有關系。
#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. 指針訪問數組成員
6.1 訪問一維數組成員的方式有哪些?
#include
#include
int main()
{
int a[]={1,2,3,4,5,6,7,8,9,0};
int *p;
p=a;
printf("下標4的值:%d\n",a[4]); //5
printf("下標4的值:%d\n",*(a+4)); //5
printf("下標4的值:%d\n",*(p+4)); //5
return 0;
}
6.2 指針訪問一維數據常用的操作方式:字符串
#include
#include
int main()
{
char str[]="1234567890";
char *p=str;
int len=0;
printf("p=%s,str=%s\n",p,str);
//計算字符串的長度
while(*p++!='\0')
{
len++;
}
printf("len=%d\n",len);
return 0;
}
6.3 指針自增和自減?++和—運算符
#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 指針自增自減偏移字節是多少?
與指針本身的類型有關系。
#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 數組本身可以當做指針使用嗎?
不可以
指針特點: 自增、自減、可以改變指向。
#include
#include
int main()
{
int a[]={1,2,3,4,5}; //*(a+3)
int b[]={11,12,13,14,15};
//下面3行代碼是錯誤的
a--;
a++;
a=b;
return 0;
}
6.6 指針可以當做數組使用嗎?
可以
數組特點: 可以通過下標訪問數組成員。
#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. 數組指針
數組指針可以指向一個一維數組,行指針也叫一維數組指針。
定義語法:char (*p)[5];
該指針指向一個二維數組里的一個一維數組地址,一維數組的成員是5個字節。
二維數組的定義方法:char a[10][5];
#include
#include
int main()
{
int (*p)[5]; //定義一個一維數組指針---行指針
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++; //加一個一維數組的大小
printf("%d\n",p[0][2]);
return 0;
}
8. 指針數組
指針數組: 表示該數組成員可以存放指針。
指針數組定義語法:int *p[5];
表示定義一個int數組,該數組的類型可以存放5個int類型的指針變量(地址)。
#include
#include
int main()
{
int a,b,c;
int *p[3]; //一次定義3個int類型的指針變量
//存放地址
p[0]=&a;
p[1]=&b;
p[2]=&c;
//對空間賦值
*p[0]=123;
*p[1]=456;
*p[2]=789;
//取出數據
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. 指針類型常見的初始化值:NULL
#include
#include
int main()
{
char *p=NULL; // (void*)0 == NULL
printf("%#x\n",p);
if(p!=NULL)
{
//判斷指針是否可以使用
}
return 0;
}
審核編輯:湯梓紅
-
嵌入式
+關注
關注
5068文章
19015瀏覽量
303239 -
C語言
+關注
關注
180文章
7598瀏覽量
136182 -
指針
+關注
關注
1文章
480瀏覽量
70509
發布評論請先 登錄
相關推薦
評論