C++学习之C语言指针

学习内容

 2指针:
   2.1指针变量:
    指针变量*p,p存储的是一个内存中的地址。*p为该地址的值
    *:取值操作符
    &:取地址操作符
   2.2 &和*运算符的自右向左运行(& * ++的优先级别一致,从右向左求值)
   举例:&*point的意思是取*point的值,然后求它的地址。
        *point++的意思是先地址+1,然后取值。(*point)++的意思是先取*point的值,然后加1.
   2.3 数组和指针
   举例:int a[10]; int*p; p=a,即指针指向数组p.也可以定义为p=&a[0];
    指针引用一个元素为:*(p+i)
   2.4 二维数组和指针
   举例:
    int(*p)[4];定义了一个二维数组. 
    *p:第0行第0列元素的地址(即对于二维数组,*p为地址。所以*p可以看成是一个一维数组的地址。其值可以是*(*p))
    *(p+i)+j:第i行第j列元素的地址。
    *(*(p+i)+j):第i行第j列元素的地址的值
   2.5 字符串和指针
    2.5.1 定义字符指针:char *p="hello world";等价于char str[]="hello world";(注:数组的结尾为\0)
    2.5.2 char *a,char *b,如果要把*a的值复制到*b中,会报错,需要修改char *b为char b[];
    2.5.3 char *a的值可以修改:char *a="1243555";a+=1;(即将指针从2开始输处)
    2.5.4 char *a可以用下标的方式输出单个字符:char *a="1245",printf("%c",a[1])
    2.5.5 函数指针的使用(变量指向函数):
       int a=1,b=2,c;
       int max(int,int);//定义一个函数
       int (*p)();//定义一个函数指针
       p=max;//将函数指针指向max函数
       c=(*p)(a,b);//通过*p调用函数指针
       重要:但是为什么要这么做呢?可以使用指向函数的指针作为某一个函数的参数传入,例如:
       void sub(int (*x1)(int),int(*x2)(int,int))
       {
        int a,b,i,j;
        a=(*x1)(i);
        b(*x2)(i,j);
       }
   2.5.6 指针函数(函数返回值为指针)
   例如:int *fun(int (*p)[4],int n);//int (*p)[4]定义了一个二维数组
   2.5.7 指针数组(还要多研究)
   数组中的每个元素都为指针类型的数据,例如int *name[4];里面有4个指针
   int a[4]={1,2,3,4};
   int *name[4]={&a[0],&[1],&[2],&a[3]};
   printf("%d",*name[0]);//打印出a[0]的值
   2.5.8 二级指针(还要多研究)
   举例:int **p2;//指向指针的指针
   int a=100;
   int *p1=&a;
   int **p2=&p1;
   
   2.5.9 void指针
   即不指定它是指向哪一种类型的指针变量。例如:void *p;
    *表示指针变量p不指向一个确定的类型数据,它的作用仅仅是用来存放一个地址。
    *void指针它可以指向任何类型数据。也就是说,可以用任何类型的指针直接给void指针赋值。
  但是,如果要将void指针的值赋给其他类型的指针,则要进行类型转换。
    *按照ANSI(American National Standards Institute)标准,不能对void指针进行算法操作,即下列操作都是不合法的:
  void *pvoid; pvoid++;//不合法   pvoid+=1;//不合法
   2.5.10 const 指针
    (1) const char *str="ni hao";//声明一个名为str的指针变量,指向一个字符型常量(const其实修饰的是 nihao,即nihao不能被修改)
        str[0]='w';//语法错误,常量不能被修改,但是可以可以改变str指针的值
        str="ni hao 2";//合法!
    (2)  char * const str="ni hao";//常量指针是一个固定指针,不可以改变它的值,但是它指向的数据可以改变(const修饰指针,即
    指针的地址不可以修改)
         str[0]='w';//合法
         str="ni hao 2";//错误
    (3) const char * const str="ni hao";
        str[0]='w';//错误
        str="ni hao 2";//错误

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
void swap(int *p, int length)
{
	int *m;//中间元素
	int *j;//结束元素
	int *i;//开始元素
    int temp;//临时元素
	i = p;
	m = p + (length - 1) / 2;
	j = p + length - 1;
	for (; i <= m; i++,j--)
	{
		temp = *i;
		*i = *j;
		*j = temp;
	}
}
void copy_string(char *from ,char *to)
{
	while ((*to=*from)!='\0')
	{
		to++;
		from++;
	}
}

void main()
{	 	
	int b[3],j,*p;//使用指针p打印结果,指针指向数组b
	p = b;
	printf("请输入三个元素:\n");
	for (j = 0; j < 3; j++)
	{
		scanf("%d", &b[j]);
	}
	printf("\n");
	printf("---------------------使用指针打印数组-------------------------------------\n");
	for (j = 0; j < 3; j++,p++)
	{
		printf("数组的第[%d]个元素为%d:\n", j + 1, *p);
	}
	printf("---------------------使用指针交换顺序:交换前-------------------------------------\n");
	int i,a[8] = { 1,5,7,8,4,10,11,6 };
	for (i=0;i<8;i++)
	{
		printf("数组的第[%d]个元素为%d:\n",i+1,a[i]);
	}
	swap(a, 8);
	printf("---------------------使用指针交换顺序:交换后-------------------------------------\n");
	for (i = 0; i < 8; i++)
	{
		printf("交换后,数组的第[%d]个元素为%d:\n", i + 1, a[i]);
	}
	printf("---------------------打印二维数组-----------------------------------------------\n");
	int(*point)[4];
	int c[3][4] = { {1,2,3,5},{4,5,6,9},{7,8,9,11} }, m,n;
	point = c;
	for (m=0; m < 3; m++)
	{
		for (n=0; n < 4; n++)
		{
			printf("%5d",*(*(point+m)+n));
		}
		printf("\n");
	}
	printf("------------------------使用指针字符串拷贝-----------------------------------------------\n");
	//拷贝字符串,将a的字符串拷贝到a
	char *str_a = "ni hao a";
	char str_b[] = "ni hao b";//不能使用*str_b定义字符串会报错,要使用char str_b[];因为*str_b为常量,不能被修改
	copy_string(str_a,str_b);
	printf("%s\n",str_b);
	printf("--------------------------------函数指针使用-----------------------------------------------\n");
	int add(int a, int b);
	int del(int a, int b);
	int mult(int a, int b);
	void process(int a, int b, int(*p)());//定义一个函数指针*p
	int fun_a = 5, fun_b = 2,(*fun_point)();
	fun_point = add(fun_a,fun_b);
	process(fun_a, fun_b, fun_point);
	fun_point = del(fun_a, fun_b);
	process(fun_a, fun_b, fun_point);
	fun_point = mult(fun_a, fun_b);
	process(fun_a, fun_b, fun_point);
	printf("--------------------------------void指针使用-----------------------------------------------\n");
	void *void_p;
	int  *int_p=3;
	int *copy_from_voidp;
	void_p = int_p;
	printf("将int_p的值赋给void_p(*void_p=*int_p):%d\n", void_p);
	copy_from_voidp = (int *) void_p ;//将void指针转换为float
	printf("将void_p的值赋给copy_from_voidp(int_p=(int)void_p):%d\n", copy_from_voidp);

}
int add(int a, int b)
{
	return a+b;
}
int del(int a, int b)
{
	return a - b;
}
int mult(int a, int b)
{
	return a * b;
}
void process(int a, int b,int(*p)())
{
	int c;
	c = p;//c接受函数返回结果
	printf("这里调用了指针函数(*p)():%d\n", c);
}
int x = 10, y = 8;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值