内容简介:
1、指针常量与常量指针,
2、指针与数组,
3、指针与函数,
4、指向指针的指针,
5、*void指针
指针://也叫指针地址,即一块内存地址
注意:
指针若没有初始化就拿去用,是很危险的,程序会崩溃(crash)——>野指针调用
一、指针常量与常量指针
指针常量: 是指针,指向的地址不可变(eg: 数组)
常量指针: 指向常量。
二、指针与数组:
【1】用指针遍历数组:
//
遍历数组
int a[] = {10, 20, 30, 40, 50};
int
count =
sizeof
(a) /
sizeof
(
int
);
// 传统遍历
for ( int i = 0 ; i < count; i++) {
printf( "a[%d] is %d\n" , i, a[i]);
}
// 指针遍历
int *p = a;
// 不改变 p 的指向
for ( int i = 0 ; i < count; i++) {
printf( "a[%d] is %d\n" , i, *(p + i));
}
// 改变 p 的指向
for ( int i = 0 ; i < count; i++) {
printf( "a[%d] is %d\n" , i, *p);
p++;
// 传统遍历
for ( int i = 0 ; i < count; i++) {
printf( "a[%d] is %d\n" , i, a[i]);
}
// 指针遍历
int *p = a;
// 不改变 p 的指向
for ( int i = 0 ; i < count; i++) {
printf( "a[%d] is %d\n" , i, *(p + i));
}
// 改变 p 的指向
for ( int i = 0 ; i < count; i++) {
printf( "a[%d] is %d\n" , i, *p);
p++;
}
【2】*p++; *(p++); *(++p); ++(*p); (*p)++
int a[] = {10, 20, 30, 40, 50};
int
*p = a;
//以下语句均单独运行:
printf(
"%d\n
”
, *p);
//10
printf(
"%d\n"
,
*(p++)
);
//10 先把p取出,*p,然后再++
printf(
"%d\n"
,
*p++
);
//10 //与上一个的效果一样
printf(
"%d\n"
,
*(++p)
);
//20 //p指向第二个元素,即a[1],<==>*(p+1)或*(a+1)
printf(
"%d\n"
,
++(*p)
);
//11 //<==> ++a[0]
printf(
"%d\n"
,
(*p)++
);
//11 //<==> a[0]++
【3】访问数组元素:
for(int i = 0; i< 5; i++){
//四种方法,任一即可
printf(
"%d\n
”
, a[i]);
printf(
"%d\n
”
, *(a + i));
printf(
"%d\n
”
, *(p + i));
printf(
"%d\n
”
, p[i]);
}
三、指针与函数:
【1】指针函数:是一个函数,返回值是指针
(1)//
指针函数
char
* string()
{
return
"wxhl"
;
}
//调用:(main函数中)
printf(
"wxhl is %s\n"
, string());
(2)//
参数中带指针
void
sum(
int
a,
int
b,
int
*result)
{
*result = a + b;
}
//调用:(main函数中)
int
a =
10
, b =
5
,
result = 0;
int
*p = &result;
sum(a, b, p);
printf("a = %d, b = %d, result = %d\n", a, b, result);
【2】函数指针:是指针,指向一个函数
【】#include
<stdio.h>
int
sum(
int
a,
int
b)
{
//加法函数
return
a + b;
}
int
minus(
int
a,
int
b)
{
//减法函数
return
a - b;
}
}
//在main函数中定义一个函数指针
//
函数指针的类型取决于指向函数的返回值类型
int (*p)(int,int)=sum;
//<==>int (*p)(int a,int b)= sum;
// 使用
int result = p( 10 , 20 );
printf( "result is %d\n" , result);
【】//我们可以将一个函数指针作为参数
int testFun(int a, int b, int (*p)(int a, int b))
{
int testFun(int a, int b, int (*p)(int a, int b))
{
//调用函数指针p
int result = p(a, b); //a、b在此处是实际参数,传入到函数指针p指向的函数中
return
result;
}
int
main(
int
argc,
const
char
* argv[]) {
//main中
使用函数指针
testFun
int result;
result = testFun(
8
,
2
, p);
//p可换成sum
printf(
"result is %d\n"
, result);
result = testFun( 8 , 2 , minus);
printf( "result is %d\n" , result);
result = testFun( 8 , 2 , minus);
printf( "result is %d\n" , result);
【】对于void函数,函数指针的使用:
void
test()
{
printf( "hehe\n" );
{
printf( "hehe\n" );
}
//
定义一个函数指针,指向
test
函数
void (*p1)() = test;
// 使用
p1();
void (*p1)() = test;
// 使用
p1();
四、指向指针的指针:
int a = 10 ;
// 指向数值的指针
int *p1 = &a;
// p2 中的指针地址,指向 p1
int **p2 = &p1;
printf("%d\n",**p2);
五、*void 指针
/*void
指针可以指向任意类型
*/
int
a =
10
;
char *string = "wxhl";
printf(
"string is %s\n"
, string);
void
*p1 = &a;
//
指向数值的指针
void
*p2 = string;
//
指向字符串的指针
printf(
"a = %d\n"
, *((
int
*)p1));
printf("string is %s\n", (char *)p2);
五、QUestion
(1)什么是指针变量?
(2)怎么取出一个变量的指针地址,怎么取出指针指向的目标地址?
(3)如何通过指针遍历数组?
(4)什么是指针函数,什么是函数指针?
(5)什么是双重指针如何定义一个双重指针变量?
(6)数组中的数据元素在内存中是如何分配的?
(7)函数指针有什么作用?