指针

二维数组:首先确定第一行然后将第一行的列填满,再进行第二行,然后再将第二行的列填满,若不够的系统默认以0补上

如a[2][3] = {1,2,3,4,5};

结果为

1  2  3

4  5  0

 

例如

void main()

{

    int a = 1;

    int *p = &a;//是定义int *类型的p, 并给p初始化为&a。 等效于int *p;

    *p = &a;//是把a的地址赋值给*p, p需要是int **类型

     p = &a;//把a的地址,赋值给p, p需要是int *类型,是给p赋值,而不是给*p赋值

     pirntf("%d",*p);

     printf("%d",p);

    display:   1    1638212// 显示*p与p的结果

    定义指针的类型需要与变量的类型一致,因为编译器需要知道一个指针移动时的步长 

 

 

          int * 是指向int类型的指针;

 

         int **,也即(int *) *,是指向int *类型的指针,也就是指向指针的指针;

 

         int ***,也即(int **) *,是指向int**类型的指针,也就是指向指针的指针的指针;

         不管什么类型,只要是指针 长度就是4个字节;

 

        

  int *a[] ={1,2,3,4};

  int i;


  for(i = 0;i<4;i++)
  {

    printf("%d\n",*(a+i));
           printf("%d\n",a+i);
  }

  return 0;

    display: 1  2   3    4//显示*(a+i)

    display:2686716    2686720    2686724    2686728显示(a+i)

}

一个指针是一个地址,是一个常量,一个变量的地址称为这个变量的指针

如果有一个变量专门用来存放另一个变量的指针,则称为指针变量,如:定义指针*p=&a,说明p是一个指针变量。

 

 

 

int main(int argc, char *argv[]) {
int a = 10;
int b = 20;
int *p = &a;
printf("%d\n",*p); //代表a的数值 使用p进行间接访问
*p = 40; //对a地址里的内容进行操作
printf("%d\n",a);
printf("%d",p); //代表a的地址
return 0;
}

运行结果

 

指针所占据的空间由操作系统的位数决定如64位操作系统,那么指针所占据的空间就是8K

 

数组作为函数参数(在score大于等于90的姓名后面加上A)

typedef struct stu
{
char name[40];
char sex;
int score;
}student;
void mark(student *p,int count)  //指针可以当数组用,数组可以当指针用
{
int i;
for(i = 0;i<count;i++)
{
if(p[i].score >= 90)  //p[i].score中的p要与所定义的指针变量一致,p[i].score指的是结构体中的stu1[].score
{
strcat(p[i].name,"(A)");
}
}
}
void prin(student *arry,int coun)
{
int j = 0;
for(j = 0;j<coun;j++)
{
printf("%s %d ",arry[j].name,arry[j].score);
}
}
int main(int argc, char *argv[]) {
student stu1[5] = {
{"wangwu",'m',95},
{"lisi",'m',92},
{"zhangsan",'m',46},
{"xiaolin",'m',85},
{"zhaogou",'m',90}
};
prin(stu1,sizeof(stu1)/sizeof(stu1[0]));
mark(stu1,sizeof(stu1)/sizeof(stu1[0]));
prin(stu1,sizeof(stu1)/sizeof(stu1[0]));
return 0;
}

运行结果

 

打印出一个字符串里有多少个a并将a换成A

方法一:

void arr(char *st,int count)
{
int number = 0;
int i;
for(i = 0;i<count;i++)
{
while(st[i] != '\0')
{
if(st[i]=='a')
{
number++;
st[i] = 'A';
}
st++;
}
}
printf("%d\n",number);
}
int main(int argc, char *argv[]) {
char str[] = "happy new yeaaaaar";
arr(str,sizeof(str)/sizeof(str[0]));
printf("%s",str);
return 0;
}

方法二:

void arr(char *st)
{
int number = 0;
while(*st != '\0')
{
if(*st == 'a')
{
number++;
*st = 'A';
}
st++;
}
printf("%d\n",number);
}
int main(int argc, char *argv[]) {
char str[] = "happy new yeaaaaar";
arr(str);
printf("%s",str);
return 0;
}

运行结果

 

将数值大于20 的清零

void arr(int *p,int count)
{
int i;
for(i = 0;i<count;i++)
{
printf("%d ",p[i]);
}
printf("\n");
}
void prin(int *p,int count,int min)
{
int j;
for(j = 0;j<count;j++)
{
if(p[j]>min)
p[j] = 0;
printf("%d ",p[j]);
}
}
int main(int argc, char *argv[]) {
int number[] = {1,2,6,8,9,7,12,63,54};
arr(number,sizeof(number)/sizeof(number[0]));
prin(number,sizeof(number)/sizeof(number[0]),20);
return 0;
}

运行结果

 

static函数

静态变量  相当于在函数内部定义了一个局部变量

比如:

void test()
{
static int i = 1;
printf("%d\n",i++);
}

int main(int argc, char *argv[]) {
test();
test();
test();
return 0;
}

test函数开设了一个静态变量 i 并赋初值1,这个变量在main函数还没运行就创建好了 ,程序运行多次调用test函数时并不会重新赋值,而是将 i 运行之后的值置为当前值

运行结果

 

int main(void) {
int *a[10]; //指针数组,表示同时创立了10个指针
int b,c;

a[2] = &b; //第二个指针指向的元素
a[3] = &c; //第三个指针指向的元素

b = 10;
c = 20;

printf("b = %d,c = %d\n",*a[2],*a[3]); //打印b与c两个元素的值
printf("b = %d,c = %d",a[2],a[3]); //打印b与c两个元素的地址

运行结果

 

int a[] = {1,2,3,4};
int *p = &a; //对于数组来说*p=a与*p=&a与p=a是一样的都是指向数组首地址
//int *p;
//p = a;

 

//数组名与指针    指针可以当数组用,数组可以当指针用

int a[] = {1,2,3,4};
int *p = a;

printf("%d\n",*(++p));//指向第1个元素
printf("%d\n",*(p+1));//在运行*(++p)后再运行*(p+1),此时指向的是第二元素
printf("%d\n",*(a+1));//指向第一个元素

/*(a+1)与*(p+1)是一样的,指的是指向第一个元素因为*a与*p指向了数组首地址也就是第0个元素

*(p++)只能一次加一,就是说一次只能往下移动一个元素
*(a+1)与*(p+1)可以指定移到哪个元素
注:*(a++)不成立,因为a是数组是只可以读取而不可以更改的,指针是可读可更改的 ,而*(a+1)则成立*/

运行结果

 

posted @ 2017-05-24 20:07  黎明忠  阅读(193)  评论(0编辑  收藏  举报