c语言基础(六)

来源:互联网 发布:java 取整数部分 编辑:程序博客网 时间:2024/05/17 09:47

指针

1.指针用于保存地址的,地址是一个数字
定义一个指针变量p,类型是int* ,指向一个int型的数据
int *p
涉及的指针符号:* &
p = &a;//指针的绑定,&a是一个int*类型
*p = 23;//指针的解引用,
* 作为解引用的符号,*p得到了变量(a)
2. 定义指针的同时并且初始化
int *p1 = &a; //== int *p, a; p = &a

aarr[4]={10,20,30,40}int *p = arr;p=&a*p=a位置1 位置2 位置3 位置4 10    20    30   40p=位置1,即数组元素首地址,即arr[0]*p=10,位置1内存放的数(*p)++ 先取到位置1内存放的数10,然后+1=11*p++   即先取到位置1的数10,然后位置1+1到位置2*++p   即位置1+1到位置2,再取出位置2的数20

3.指针的运算,就是加减指针所指向的变量类型所占字节大小(sizeof(int))*1
p1++指针偏转后指到别的地方了
同一数组中,两指针相减可得出元素的个数。如果是两个数组的指针相减,将导致未定义的结果

int arr[5] = {1, 3, 5, 7, 9};int *p = arr;int *q = arr+5;//指向9的后一位int ret=q-p;//元素个数

4.野指针
int *p // p=NULL
危害:1、直接指向内核区
2、指向可用也没有别的数据的区域
3、可用但有别的数据
//NULL专用于指针的初始化(写0)
int *p = NULL;(在这里可以将NULL看为编译器内置的宏)

const

const关键字表示:修饰的变量是常数,不可更改,只能初始化一次,没有影响变量存储的方式

const int a = 23;a=1;不行const int b;b是随机值printf("p=%p\n",p);打印p所指向的地址printf("&p=%p.\n",&p);打印p所在内存中的地址
int *p=NULL;p=&a;*p=2;//正确,可以通过指针更改内容printf("%d",a);

const修饰一个指针类型变量

const int *p;//const修饰*p,p的内容不可更改int const *p;//const修饰*p,p的内容不可更改int * const p;//const修饰p,p本身不可修改const int *const p;//const修饰p本身及其内容,均不可改

宏定义和const?

宏定义是替换,且宏没有类型函数原型用const在修饰函数参数时,表示输入型参数(const

const与指针
int const *p1;

传址调用 func(&a)

1.数组名作为函数参数退化为一个指针
2.子函数内部改变了原数组

malloc与new

在c++下,申请的是堆空间(也是一般内存)
流程:申请,判断成功,初始化,使用,释放,指针设置为空
申请空间:

int * shenqing_memory(int num){    int *p = (int *)malloc(num*sizeof(int));    if (NULL == p)    {        return p;    }    memset(p, 0, num*sizeof(int));    return p;}
newdelete相互配合使用new+类名:new int:创建一个int类型的数;new int(0):创建一个int类型的数,并且初始化,new int[10]:创建10int数据的数组new string[10]:创建10个字符串类型的数组new是一个运算符,就和sizeof一样

堆内存也是内存的一种,需要程序员自己手动申请(敲代码),自己手动释放,编译器不会自动回收,要用delete回收
在c语言中,用malloc手动申请空间(malloc申请的空间,默认是有最小分配的),用free来回收,清空内存用memset( );

If size is 0, then malloc() returns either NULL, or a unique pointer value that can later be successfully passed to free(). 如果长度为0,则返回不是空指针,而是一个可以被成功返回的唯一指针。

memset(p,0,mem*sizeof(int));

#include<stdlib.h>int *p = NULL;p = (int *)malloc(100);

关于释放内存:

1.整个程序结束,会自动释放堆内存(切断它与堆内存的联系)2.申请一次,释放一次,不能多次释放3.释放的堆内存,必须是这块内存的首地址

typedef

typedef是重命名的关键字,他不是发明新类型,而是给类型起了一个新外号

1.typedef int my_int//将int重命名为my_int 2.typedef char * my_char//将char*重命名为my_char 3.typedef (void (*p)(void)) my_func//将void * void 类型的函数重命名为my_func 4.typedef void (*p_arr[10])(void);//函数指针数组:数组里面的元素都是指针(函数指针)

函数是一个地址,也就可以理解成指针,所以函数也可以用类型这个理解方法
类型吗+变量名
定义一个函数指针并且绑定
void(* p)(void)=func/void(*p)(void)=&func;
c语言里对于函数名的绑定有两种方式:
①func
②&func,通常写成func
调用:
p();/(*p)();
func * &a=*&func()=func()
void (*p)(void) = &func;

二维数组

二维数组的变量名是首元素首地址{arr[0], arr[1]}
int arr[2][3] = {1, 2, 3, 4, 5, 6};
arr代表数组首元素首地址(&arr[0])
&arr[0]代表第一维数组的首元素首地址
&arr[0][0]代表数组的第二维数组是首元素首地址

int arr[2][3] = {1, 2, 3, 4, 5, 6}; int (*p)[3];//数组指针, 指针指向了一个int[3]类型的数据结构p = arr;//指针方式遍历二维数组int i = 0, j = 0;for (i=0; i<2; i++){  for (j=0; j<3; j++)     printf("*(*(p+%d)+%d) = %d.\n", i, j, *(*(p+i)+j));}

利用传值调用实现swap功能

#include<stdio.h>void swap(int *p1, int *p2){    int temp;    temp = *p1;    *p1 = *p2;    *p2 = temp;}void main(void){    int a =11,b = 12;    swap(&a,&b);    printf("交换后的数为:%d,%d\n",a,b);}

malloc申请空间并且排序:

#include <stdio.h>#include <stdlib.h>#include <string.h>//申请空间int * shenqing_memory(int num){    int *p = (int *)malloc(num*sizeof(int));    if (NULL == p)    {        return p;    }    memset(p, 0, num*sizeof(int));    return p;}void swap(int *p1, int *p2);//数组赋值void set_value(int p[], int num){    int i = 0;    //一共赋值num次    printf("输入个元素数值:\n");    for (i=0; i<num; i++)//      scanf("%d", &p[i]);        scanf("%d", p++);}//排序void func_arr(int *p, int lenth){    int i = 0, j = 0;    for (i=0; i<lenth-1; i++)    {        for (j=0; j<lenth-1-i; j++)        {            if (*(p+j) > *(p+j+1))            {                swap(p+j, p+j+1);            }        }    }   }//交换两个数值void swap(int *p1, int *p2){    int temp;    temp = *p1;    *p1 = *p2;    *p2 = temp;}void arr_show(int *arr, int num){    int i = 0;    while (num--)    {        printf("%d ", *arr++);    }    printf("\n");}int main(void){    int num = 0;    printf("输入数组个数:");    scanf("%d", &num);    int *p = shenqing_memory(num);    set_value(p, num);    //排序    func_arr(p, num);    arr_show(p, num);    if (NULL != p)    {        free(p);        //p就是一个野指针        p = NULL;    }    return 0;