对C语言指针的简单理解

    什么是指针?指针就是存放地址的变量;指针也是变量,也有内存地址,其类型长度为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

猜你喜欢

转载自blog.csdn.net/qq_40572277/article/details/84548593
今日推荐