什么是指针?指针就是存放地址的变量;指针也是变量,也有内存地址,其类型长度为4byte(32位)、8byte(64位)。
如何使用?如:
1.指针指向变量;
int main(){
char *p ;//声明一个字符型指针p;
char a = 'b';//声明一个字符型变量a,并赋值为'b';
p = &a;//指针p指向变量a,既p存放了变量a的地址
printf("指针p存放的地址:%ld\n",p);
printf("变量a的地址:%ld\n",&a);
return 0;
}
输出的值都是相同的。
2.指针指向一串字符;
int main(){
char *p = "say you";//双引号申请一段空间存放字符串并返回首地址给指针p,此时p成为指向数组的指针;
if(p == "say you"){
printf("all right");
}
printf("%c\n",*(p+1));//指向数组的指针可以使用*p、*(p+1)访问元素;
return 0;
}
输出的结果为:all right
a
3.数组名与指针:数组声明后,编译器自动为数组分配数组长度大小的内存空间,数组名存放了该空间的首地址;而声明指针,编译器未对指针变量做任何处理;指针只能手动(malloc,calloc,realloc)获取内存空间或指向已经存在的内存数据块。
int main(){
char a[8];//声明一个长度为8的字符型数组,编译器自动为其分配了8字节的内存空间,数组名a存放分配的空间的首地址;
char *p;//声明一个字符型指针,指针指向0,为空指针。
printf("数组a的地址:%ld\n",a);
pirntf("指针p的地址:%ld\n",p);
return 0;
}
输出结果为:数组a的地址:一个随机分配的内存地址
指针p的地址:0
int main(){
char a[] = "say you";//字符串将字符对应存放到数组a中,数组a和字符串分别为两个不同的内存块,
char *p = "say you";//指针p指向字符串“say you”的首地址,指针p存放的地址与字符串的首地址相同,属于同一内存块;
printf("数组a的地址:%ld\n",a);
printf("指针p的地址:%ld\n",p);
printf("字符串的地址:%ld\n","say you");
return 0;
}
输出的结果:数组a的地址为一个随机分配的内存地址,指针p存放的地址等于字符串"say you"的地址;
4.指向指针的指针
定义: 数据类型 **变量名;
作用:存放指针的地址;
int main(){
char **p;//声明一个指向指针的指针;
char *a;//声明一个字符型的指针
char i = 'd';//声明一个字符型变量i,并初始化;
a = &i;//指针a指向变量i;即a存放了i的地址;
p = &a;//p存放指针a的地址;
printf("%ld\n",&i);
printf("%ld\n",a);
printf("%ld\n",*p);//p存放指针a的地址,*p存放变量i的地址,**p存放的是变量i的数据;
return 0;
}
输出的结果都是同一个值。
指向指针的指针的简单用法:
#include<stdio.h>
void mytest(char **p);
void mytest(char **p){
*p = "dfdf";//将字符串的首地址存放到*p中;
}
int main(){
char *a;//声明一个字符型指针变量a;
mytest(&a);//传递指针a的地址
printf("%s\n",a);//获取函数mytest()传递过来的数据;
return 0;
}
输出结果为:dfdf
5.函数指针
定义:类型名 (*函数名)(参数);
要区别于返回类型,如下:
#include <stdio.h>
int *test(int);//声明一个返回类型为整形指针的函数test;
int *test(int i){
int *c;//声明一个整形指针变量c;
c = &i;
return c;//返回指针c;
}
int main(){
int *(*my)(int);//声明一个返回类型为整形指针的函数指针my;
int *p;
my = test;//函数指针my指向函数test,单独的函数名test表示该函数所占内存的首地址;
p = my(3);//相当于p = test(3);
printf("%d\n",*p);
return 0;
}
输出的结果为:3