C语言指针 简单整理了一下自己的笔记 帮自己梳理知识的过程同时分享给大家!
一、指针的定义以及使用
1.格式:数据类型 *指针变量名称;
例如:int *p1;
char *p2;
需要注意的是:这里的*表示该变量是指针变量(指针变量是P1,P2 而不是*p1,*p2)
2.使用:int *p; int a=10; p=&a;
因为指针变量存放的是地址,所以想要指针指向a,就需要把a的地址给p(即p=&a)
二、定义指针变量时的注意点
1. 上面提到了指针变量是p而不是*p,下面就来具体说一下p与*p的区别
比如我们定义一个指针变量并赋值:
int *p; int c=12; p=&c;
p代表的是指针变量,p的值是p所指向变量的地址即变量c的地址。
*p指的是p所指向的变量的值即12;
2. 引用指针变量时的*号与定义指针变量时的*号不同;定义变量时的*只是表示其后的变量时指针变量,而*p代表取值。如上面例子:*p=12;
三、指针与函数
1.指针变量作为函数参数
例:
#include<stdio.h>
void test(int *p)
{
*p = 10;
}
int main()
{
int a = 100;
test(&a);
printf("%d\n",a);
return 0;
}
2.函数返回指针
定义函数格式: 数据类型 *函数名(形参){ 函数体;}
例如:int *test(int a,int b){ 函数体;}
说明:定义一个返回指针值得函数与之前定义函数的格式基本相同,只是在函数名前加*号,它就表示该函数返回一个指针值并且这个指针是指向一个int类型的数据。
3.指向函数的指针变量
定义格式:数据类型 (*指针变量名)(形参)
说明:数据类型:指针变量所指向的函数的返回值类型
格式中的小括号不能省略
练习:求一维数组中全部元素的和
#include<stdio.h>
int add(int b[],int n)
{
int i,sum = 0;
for(i=0;i<n;i++)
{
sum=sum+b;
}
return sum;
}
int main()
{
int a[5]={12,2,5,78,14},total;
//定义指向函数的指针变量
int (*p)(int b[],int n);
p=add;//函数名为函数的地址
total=(*p)(a,5);//通过p调用函数add
printf("total=%d",total);
return 0;
}
四、指针与数组
1.一维数组与指针
定义指针变量
int *p;
int a[5]={1,2,3,4,5};
p=a;
说明:数组名就为数组的地址同时也是数组首元素的地址。
输出数组元素有三种方式:下标法:a[K] 地址法:*(a+k) 指针法:p(a+k) k 为想要输出的第几个元素
2.二维数组与指针
了解二维数组后原理其实同上。
五、指针与字符串
1.字符指针
定义指向字符串的指针变量
char *name="china";
说明:这里没有定义字符数组,但字符串在内存中还是以数组的形式存放的。字符串在内存中占有一片连续的存储单元,以\0结束。
注意:1>赋值只是把字符串的首地址赋给P,而不是把字符串赋给P,因为P是一个指针变量,只能存放一个地址。
2>输出字符串时,先输出p指向的第一个字符,然后系统自动执行p++,使p指向下一个字符,再输出该字符,直到遇到‘\0'为止。
也可以用循环的方式输出字符串中的字符:
for(;*p!='\0';p++) printf("%c",*p);
2.字符数组与字符指针变量的区别
例如:
char a[]="abcdef"; char *p="abcdef";
1>存储方式不同:a存放的是字符串中的字符,而p存放的是字符串的首地址。
2>虽然a和p都能代表字符串的首地址,但是a是数组名是一个常量,而p是一个指针变量。
3>赋值方式不同
a可以进行初始化但是不能使用赋值语句
p既可以初始化也可以赋值。
4>定义数组a时,系统会给a分配一片连续的存储单元,但定义指针变量p时,只给分配一个存储单元。
|
|