11.指针2

/********************************************************************************************
* Module Name: 指针2
* Module versions: 模块版本
* Module Date: 2016 / 08 / 09
* Student: 007
* Description: 说明书
* Others: 合作其他人
* Revision History: 修订历史
********************************************************************************************/
#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>//标准输入输出库
#include<stdlib.h>//系统库

void SortArrayDec(int iArray[], int iLen);
void PrintfArray(const int iArray[], int iLen);
void SortArrayDec1(int *pi, int iLen);

/*=========================
* Function :main
* Description   :主程序,程序最开始运行的地方
* Input Para    :无
* Output Para   :无
* Return Value:有返回值,进程(exe)通信,另外一个进程可以通过这个返回值,判断进程结束
===========================*/
int main()
{
/*
1、指向数组的指针
a、数组是由连续的一块内存单元组成。数组名就是这块连续内存单元的首地址。数组成员的访问,实际上就是
对首地址进行偏移再取值的操作(数组下标引用)。
b、如果用指针变量获取首地址,然后通过指针加减运算,也可以实现类似数组下标引用。
c、指针变量是一个变量,数组名是常量,指针可以指向任意同类型数组
d、指针变量固定大小4个字节,数组一般会分配更大的内存,在做形参的时候,具有更大的节省内存的优势
2、通过指针引用数组元素
如果一个指针变量指向了一个数组,那么就可以通过以下方式进行数组元素的访问
int a[10]={0};p=a;
a、数组元素的地址:a+i,p+i,从a或者p开始的第i个元素的地址
b、数组元素的内容/值:a[i],*(a+i),*(p+i),取从a或者p开始的第i个元素的地址对应的内容
c、c语言允许指针变量带下标:*(p+i)和p[i]是等价的,建议以后都用下标方式,容易写和容易理解
  引用数组元素的方式:下标法和指针法,*(p+i)和p[i],a[i],*(a+i)

注意点:
1、指针变量是一个变量,数组名是常量:a++;错    p++;对的
  char *pc,ac[10];
  pc="abc";//对的
  ac="abc";//错的
  
2、注意指针变量当前的值(当前是否值是否为数组首地址,如果不是,那么p[0]就是不是数组第一个元素)
  pc++;//pc[0]='b'而不是'a'
3、注意越界情况,指针可以指向数组以后的内存单元,不报错,但是如果该内存是空的(野指针),
就会造成系统奔溃
4、a=*p++;等效于   a=*p;  p++;
  if(*p++){}
  等效于
  if(*p){p++}

  (*p)++;  等效于p[0]++;  也就是指向的内容自增

*/

int iNum[5] = {20,40,10,30,50},i,j,t;
int *pi = iNum;
int ai2[2][5] = { { 20, 40, 10, 30, 50 }, { 200, 400, 100, 300, 500 } };
int(*pi2)[5];//指向二维数组的指针定义,括号不能少

char acNames[][10] = { "路飞老师", "沐沐老师" };
char(*pc)[10];//(*pc)只能对应一个值,所以是不可以用来直接初始化值的
char *pc2[10] = { "路飞老师", "沐沐老师" };//指针数组里面存储着每个字符串的首地址
pc = acNames;

for (i = 0; i < 2; i++)
{
printf("%s,%s\n",pc[i],pc2[i]);
}

t = *pi++;//t=*pi=iNum[0]=0;pi++,*pi=iNum[1]=1;
printf("t=%d,*pi=%d\n", t, *pi);
(*pi)++;
printf("*pi=%d\n", *pi);

/*指针和数组作为函数参数
 1、形参和实参都是数组名
 2、实参是数组,形参是指针变量
 3、实参和形参都是指针变量
 4、实参为指针变量,形参为数组名
*/
printf("排序前\n");
PrintfArray(iNum,5);

//SortArrayDec(iNum, 5);//形参和实参都是数组名
//SortArrayDec1(iNum, 5);//实参是数组,形参是指针变量
pi = iNum;
//SortArrayDec1(pi, 5);//实参和形参都是指针变量
SortArrayDec(pi, 5);//实参为指针变量,形参为数组名

printf("排序后\n");
PrintfArray(iNum, 5);

/*
指向二维数组的指针:**p;   p[][];不允许
二维数组定义的时候要求二维长度必须给出,那么定义指向二维数组的指针也是如此
*/
pi2 = ai2;
for (i = 0; i < 2; i++)
{
for (j = 0; j < 5; j++)
{
printf("%d ",pi2[i][j]);//建议采用下标法
}
printf("\n");
}

/*
指针与字符串
1、用一个字符数组存储字符串:ac[]="abcd";
for(i=0;ac[i]!='\0';i++)//下标运算进行数组元素访问
{
}
2、用一个指针指向字符串:pc="abcd";
  提供了另外一种更简洁的遍历字符串的方式
  while(*pc!='\0')//指针运算进行数组元素访问
  {
pc++;
  }
  while(*pc)//指针运算进行数组元素访问
  {
pc++;
  }
  while(*pc++)//指针运算进行数组元素访问
  {
  }

a、字符数组存储方式,是将字符串存储到字符数组的内存里面,字符数组是可变的,故字符串的内容可变
  指针指向方式,是字符串先获取一段内存空间,然后将首地址赋予指针,字符串的内容是不可变的
  (不能通过指针去改变该字符串的值,只能获取)
b、数组名是常量不能直接赋予字符串,指针可以
  char ac[100],*pc;
  ac="abcd";错的
  pc="abcd";对的
*/
/*
指针数组:数组里面的每一个元素都是指针
char acNames[][10]={"路飞老师",“沐沐老师”};
//acName[0]  acName[1]
(*pc)[10];
pc=acNames;

*pc[]={"路飞老师","沐沐老师"};
*/


system("pause");
return 0;
}
void PrintfArray(const int iArray[], int iLen)
{
int i;
for (i = 0; i < iLen; i++)
{
printf("%d ", iArray[i]);
}
printf("\n");
}
/*=========================
* Function :SortArrayDec
* Description   :降序排序
* Input Para    :int iArray[]数组, int iLen数组长度
* Output Para   :int iArray[],排序好的数组
* Return Value:无
===========================*/
void SortArrayDec(int iArray[], int iLen)
{
int i,j,t;

for (i = 0; i < iLen - 1; i++)
{
for (j = 0; j < iLen - i - 1; j++)
{
if (iArray[j] < iArray[j + 1])
{
t = iArray[j];
iArray[j] = iArray[j + 1];
iArray[j+1] = t;
}
}
}
}
void SortArrayDec1(int *pi, int iLen)
{
int i, j, t;

for (i = 0; i < iLen - 1; i++)
{
for (j = 0; j < iLen - i - 1; j++)
{
if (pi[j] < pi[j + 1])
{
t = pi[j];
pi[j] = pi[j + 1];
pi[j + 1] = t;
}
}
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值