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;}
new与delete相互配合使用new+类名:new int:创建一个int类型的数;new int(0):创建一个int类型的数,并且初始化,new int[10]:创建10个int数据的数组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;
- c语言基础(六)
- C语言基础(六)
- c语言基础(六)之类型
- C语言基础(六)数组
- C语言(六)
- C语言基础(六)字符串及其操作
- c语言基础(六)静态和动态内存分配
- C语言基础(六)指针和多维数组
- IOS开发学习基础--------C语言(六)
- 黑马程序员-C语言基础学习(六)
- 黑马程序员-C语言基础六:函数
- Java语言基础(六)
- C语言库函数(六)
- C语言笔记(六)
- C语言(六)--数组
- 黑马程序员-iOS基础-C语言基础(六)-复杂数据类型及其他
- C语言基础(六)- 结构体、共用体、枚举和typeof自定义类型
- c语言基础语法六——结构体(完结)
- NSS_VersionCheck("3.26") failed. NSS >= 3.26 is required. Please upgrade to the latest NSS
- java连redis
- 【K-D树 K维最近距离的t个点】HDU
- 使用Bundle在fragment之间传递数据
- 企业级自动化运维工具应用实战-ansible
- c语言基础(六)
- Python入门到实践(9)-类
- BZOJ2648 SJY摆棋子 KD树
- 励志
- 基本概念:自变量和协变量
- Mybatis四大神器之四——查询(模糊)
- 下载spring的jar包
- 我的javascript入门指南-1
- 交换机 VLAN 端口类型