2016年06月06日学习日记c语言指针

2016年06月06日学习日记c语言指针
变量:内存中的存储单元,既每一个变量都需要在内存中分配一块空间来保存它的值,如int a=5,编译器需要在内存中分配4个字节来存储5这个值

指针:用来存储内存地址既地址编号的变量为指针变量(变量的内存编号)

苹果:OC 用的都是指针

指针
char aChar=‘G’;//aCha:普通变量名城;
char *p=&aChar;//声明一个指针
//p表示指针变量本身的名字;
//*:p是一个指针(告诉编译器p存储变量地址,而不是一个普通变量值)
//&: 获取变量(不是指针变量)地址,表示取地址运算符,返回变量的地址编号
//%p:输出指针变量值(一个地址)

指针占用的空间 :32位->4 64位->8(i不限类型)

指针本身也有类型:声明指针的类型和指针所指向的变量的类型要保持一致

多个指针可以指向同一个内容(变量)(多个指针值相同)

*:int *p,a=5;//声明时时说明这是个指针变量 用来存储地址
p=&a;
printf(“p=%d\n”,*p);//get
*p=4;//set
使用时是解应用运算符(获得指针指向地址里面的值)
访问内存中5这个值:
1、通过变量名a
2、通过*p对指针解引用
(指针指向谁,谁就是解引用)

int n1=100;
int n2=200;
int *p=&n1;
int *q=&n2;
*p=*q;//1、读取n2的值 2、赋值n1;
p=q;//1、读取q所指向的内容的地址2、把地址赋值给p(让p和q指向同一块空间)

#include "stdio.h"
int main()
{
    int num1=10;
    int *p1=&num1;

    float num2=4.6f;
    float *p2=&num2;

    char num3='d';
    char *p3=&num3;

    printf("int = %ld,float = %ld,char = %ld\n",sizeof(p1),sizeof(p2),sizeof(p3));//空间大小
    printf("int =%d,float=%f,char=%c\n",*p1,*p2,*p3);//通过指针读取变量内容
}

野指针:
int n1=100;
int n2=200;
int *p;//野指针 值随机 对于野指针不要做解引用操作
//NULL:系统一块特殊空间 没有权限读写(不能做解引用操作)
int *p=NULL;
//*p=1000;//error
printf(“%p”,p);//0x0

野指针和空指针区别
野指针:值时一个随机、不确定的值(很危险,可能指向一个很重要的内存)
空指针:NULL(没有任何内容)永远不要试图去访问空指针指向的内容,因为它是系统内存单元,不允许用户级别的程序去访问。
注意:不要解引用野指针和空指针

func(n1,n2)//值传递(单向,形参改,实参不受影响)
int n1;int n2;
fun(int *num1,int *num2)
{
int temp=*num1;
*num1=*num2;
*num2=temp
}
fun

(&n1,&n2)//是一种特殊的传值方式(值:地址 形參喝实參指向同一块空间)函数交换了*num1和*num2的值,就相当于交换了num1和num2两个指针指向的变量n1和n2的值。

字符串:
字符数组没有‘\0‘结尾
指针字符以’\0’结尾

课堂练习:

//指针解引用
#include "stdio.h"
int main()
{
    int num1=10;
    int *p1=&num1;

    int num2=20;
    int *p2=&num2;

    int num3=30;
    int *p3=&num3;

    printf("最大值为:%d\n",(*p1>*p2)?(*p1>*p3?*p1:*p3):(*p2>*p3?*p2:*p3)));
    printf("最小值为:%d\n",(*p1<*p2)?(*p1<*p3?*p1:*p3):(*p2<*p3?*p2:*p3)));
    return 0;
}

#include "stdio.h"
//只改变形參指向 没改变实參所指向的内容(指针传递)
void func1(int *n1,int *n2)
{
    int *temp = n1;
    n1=n2;
    n2=temp;
    printf("n1=%d,n2=%d\n",*n1,*n2);
}
//形參与实參指向同一块空间 改变了实參所指向的内容(指针传递)
void func2(int *n1,int *n2)
{
    int temp =*n1;
    *n1=*n2;
    *n2=temp;
    printf("n1=%d,n2=%d\n",*n1,*n2);
}
//值传递 单向的 形參改变不能改变实參
void func3(int n1,int n2)
{
    int temp =n1;
    n1=n2;
    n2=temp;
    printf("n1=%d,n2=%d\n",n1,n2);
}
int main()
{
    int num1=1,num2=2;
    func3(num1, num2);
    printf("num1=%d,num2=%d\n\n",num1,num2);
    func1(&num1, &num2);
    printf("num1=%d,num2=%d\n\n",num1,num2);
    func2(&num1, &num2);
    printf("num1=%d,num2=%d\n\n",num1,num2);
    return 0;
}
//求平均值与交换函数
#include "stdio.h"
double ave(double *a1,double *b1, double *c1)
{
    return ((*a1+*b1+*c1)/3);
}
void change(int *n1,int *n2)
{
    int temp;
    temp=*n1;
    *n1+=*n2;
    *n2=temp-*n2;
}
void swap(int *n1,int *n2)
{
    int *temp;
    temp=n1;
    n1=n2;
    n2=temp;
}
int main()
{
    double a=10,b=20,c=30;
    int n1=10,n2=20;
    printf("the average is %f\n\n",ave(&a,&b,&c));
    change(&n1,&n2);
    printf("n1=%d,n2=%d\n\n",n1,n2);
    swap(&n1,&n2);
    printf("n1=%d,n2=%d\n\n",n1,n2);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值