在C语言中,每一个变量都有一个内存位置,每一个内存位置都定义了可使用连字号(&)运算符访问的地址,它表示了在内存中的一个地址。指针是C语言的重中之重及精华的地方,所以我尽量多些代码来熟悉,看一个Demo:
#include<stdio.h>
int main()
{
int var1 = 10;
char var2[10];
printf("address of var1 is %p \n",&var1);
printf("address of var2 is %p \n",&var2);
return 0;
}
result:
address of var1 is 00CFFD5C
address of var2 is 00CFFD48
什么是指针
指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址。就像其他变量或常量一样,您必须在使用指针存储其他变量地址之前,对其进行声明。指针变量声明的一般形式为:
type *var_name
int *ip; //一个指向整型的指针
char *ch; //一个指向char类型的指针
所有实际数据类型,不管是整型、浮点型、字符型,还是其他的数据类型,对应指针的值的类型都是一样的,都是一个代表内存地址的长的十六进制数。
不同数据类型的指针之间唯一的不同是,指针所指向的变量或常量的数据类型不同
如何使用指针
使用指针时会频繁进行以下几个操作:定义一个指针变量、把变量地址赋值给指针、访问指针变量中可用地址的值。这些是通过使用一元运算符 * 来返回位于操作数所指定地址的变量的值。看demo:
#include<stdio.h>
int main()
{
int var = 0;
int \*pointer = &var; //得到变量var储存的地址
printf("address of var is %p\n",&var);
printf("address of var is %p\n",pointer);
printf("data is %d\n",*pointer); //*运算符为取出地址的内容
return 0;
}
result:
address of var is 00DBF95C
address of var is 00DBF95C
data is 0
指针数组和数组指针
看demo
#include <stdio.h>
const int MAX = 3;
int main ()
{
int var[] = {10, 100, 200};
int i, \*ptr[MAX]; //指针数组
for ( i = 0; i < MAX; i++)
{
ptr[i] = &var[i]; /* 赋值为整数的地址 */
}
for ( i = 0; i < MAX; i++)
{
printf("Value of var[%d] = %d\n", i, *ptr[i] );
}
return 0;
}
C语言没有字符串,可用数组,Demo:
#include <stdio.h>
const int MAX = 4;
int main ()
{
const char *names[] = {
"Zara Ali",
"Hina Ali",
"Nuha Ali",
"Sara Ali",
};//声明了一个字符串指针数组
int i = 0;
for ( i = 0; i < MAX; i++)
{
printf("Value of names[%d] = %s\n", i, names[i] );
}
return 0;
}
指向指针的指针
指向指针的指针是一种多级间接寻址的形式,或者说是一个指针链。通常,一个指针包含一个变量的地址。当我们定义一个指向指针的指针时,第一个指针包含了第二个指针的地址,第二个指针指向包含实际值的位置 pointer.PNGint **ptr; //ptr指向一个指针,该指针指向一个int类型的数据
#include<stdio.h>
int main()
{
int var = 100;
int *ptr;
int **pptr;
ptr = &var;
pptr = &ptr;
printf("data of var is : %d\n",var);
printf("data of prt is %p\n",ptr);
printf("the data store in prt is %d\n",*ptr);
printf("data of pprt is %p\n",pptr);
printf("the data store in pprt is %p\n",*pptr);
return 0;
}
result:
data of var is : 100
data of prt is 00D3FCC0
the data store in prt is 100
data of pprt is 00D3FCB4
the data store in pprt is 00D3FCC0
//可以看到,var的值为100,它存储的位置是00D3FCC0
//ptr的值为00D3FCC0,它储存的位置是00D3FCB4
//因此,可以通过pptr一步步链接找到vae的值
//指针的指针即是指向指针的指针
传递指针给函数
C 语言允许您传递指针给函数,只需要简单地声明函数参数为指针类型即可。
#include<stdio.h>
void assignment(int *ptr); //接受一个指向int类型的数据的指针作为参数
int main()
{
int var = 10;
printf("before assignment: %d\n",var);
assignment(&var);
printf("after assignment: %d\n",var);
return 0;
}
void assignment(int *ptr)
{
*ptr = 20;
}
result:
before assignment: 10
after assignment: 20
//传递指针到函数是直接对地址进行操作,所以可以修改值
//DEMO:传递数组给函数
\#include<stdio.h>
\#include<stdlib.h>
void increase(int *ptr,int size);
int main()
{
int Arr[3] = {0};
int i = 0;
printf("before increase\n");
for(i= 0 ;i < 3;i++ )
{
printf("%d ",Arr[i]);
}
increase(Arr,3);
printf("\nafter increase\n");
for(i= 0 ;i < 3;i++ )
{
printf("%d ",Arr[i]);
}
system("pause");
return 0;
}
void increase(int *ptr,int size)
{
int i;
for(i = 0; i <size ; i++ )
{
*(ptr+i) =i;
}
return ;
}
result:
before increase
0 0 0
after increase
0 1 2
函数指针
函数指针是指向函数的指针变量。通常我们说的指针变量是指向一个整型、字符型或数组等变量,而函数指针是指向函数。函数指针可以像一般函数一样,用于调用函数、传递参数。
函数指针变量的声明:
datatype (*ptr) (datatype,datatype)
#include<stdio.h>
#include<stdlib.h>
int max_n(int a ,int b)
{
if(a>b)
return a;
else
return b;
}
int main()
{
int (* ptr)(int,int) = max_n; //指向max函数
int a , b;
a = 2;
b = 4;
printf("%d ",ptr(a,b));//直接调用函数
return 0; }
***回调函数
函数指针作为某个函数的参数:函数指针变量可以作为某个函数的参数来使用的,回调函数就是一个通过函数指针调用的函数。简单讲:回调函数是由别人的函数执行时调用你实现的函数。
#include<stdio.h>
#include<stdlib.h>
int getNumber(void)
{
return rand();
}
int getNumber(int a)
{
return rand();
}
void GetArr(int *ptr,int size,int (*getNumber)(void)) //注意这里引用的格式
{
int i;
for(i = 0;i<size;i++)
{
ptr[i] = getNumber();
}
}
int main()
{
int data[10];
int i = 10;
GetArr(data,10,getNumber);
for(i=0;i<10;i++)
{
printf("%d ",data[i]);
}
printf("\n");
return 0;
}
网友评论