您的位置:首页 > 其它

20150603指针基本操作及应用

2015-06-09 19:36 369 查看
//
// main.c
// IOS150603
//
// Created by
Peng Junlong on 15/6/3.
// Copyright (c) 2015年 Peng Junlong. All rights reserved.
//

#include <stdio.h>

//*************************
//* *
//* 指针基本操作 *
//* *
//*************************

//地址:变量定义在内存中,也有自己的地址
//int a;

//通过&获取变量在内存的位置,%p占位符用来打印地址
//int main(int arg ,const char *argv[])
//{
// int a = 100;
// printf("%p\n",&a);
// return 0;
//}

//指针变量:是保存变量内存地址的工具;本质是变量,保存其他变量的地址
//int *p = &a;

//数据类型(指针指向变量的数据类型)+* (指针变量说明符)+变量名;
//int * 是指针变量的类型
//int main(int arg ,const char *argv[])
//{
// int a = 100;
// int *p = &a;
// printf("%p\n",&a);
// printf("%p\n",p);

// //指针变量也是一个变量,也有自己的地址
// printf("%p\n",&p);
// return 0;
//}

//间接寻址 *

//通过变量的地址寻址到对应地址的变量空间

//间接寻址符*和&是一对互逆运算符
//int main(int arg ,const char *argv[])
//{
// int a = 100;
// int *p = &a;
// printf("a = %d\n",*p);
// printf("a = %d\n",*&a);
// printf("a = %d\n",a);
//}

//指针变量的大小:只跟平台有关系,32平台占4个字节,64位平台占用8个字节
//int main(int arg ,const char *argv[])
//{
// printf("char * size = %lu\n",sizeof(char *));
// printf("int * size = %lu\n",sizeof(int *));
// printf("float * size = %lu\n",sizeof(float *));
// printf("double * size = %lu\n",sizeof(double *));
// printf("long * size = %lu\n",sizeof(long *));
//
// return 0;
//}

//多个指针指向同一个变量
//int main(int arg , const char *argv[])
//{
// int a = 100;
// int *p = &a;
// int *p1 = p;//指针变量可以直接给指针变量赋值
// printf("a = %d\n",*p);
// printf("a = %d\n",*p1);
// return 0;
//}

//泛型指针:可以指向任意变量类型的地址
//void *
//int main(int arg,const char *argv[])
//{
// int a = 100;
// long b = 200;
// float c = 3.144;
// void *p = &a;
// printf("a = %d\n",*(int *)p); //在访问对应的内存空间时,需要指定对应的数据类型,进行强制类型转换
// p = &b;
// printf("a = %ld\n",*(long *)p);
// p = &c;
// printf("a = %f\n",*(float *)p);
// return = 0
//}

//空指针:NULL
//#define NULL ((void *)0);操作系统预留出来的地址,没有使用,任何类型的指针都可以指向它

//野指针:

//1.定义了指针变量后没有给初值

//2.指针变量指向的内存空间被释放
//#include <stdlib.h>
//int main(int arg,const char *argv[])
//{
// int *p = NULL;
// //1.申请内存
// p = (int *)malloc(100); //指向分配的内存空间的首地址
// //2.判断内存是否申请成功
// if(!p)
// return -1;
// //3.使用内存
// scanf("%d",p);
// printf("%d\n",*p);
// //4.释放内存
// free(p);
// p = NULL; //若不指向NULL,则p变成野指针
//
// return 0;
//}

//指针运算
//++ --

//指针变量改变的长度为指针指向的数据类型的长度
//int main(int arg ,const char *argv[])
//{
// int a[10] = {1,2,3,4,5,6,7,8,9,10};//a[0]是int类型,&a[0]是 int
* 类型
// int *p = a; // 数组名就是数组的首地址
// printf("%d\n",*p);
// for (int i=0; i<10; i++) {
// printf("%d\n",*(p+i)); //指针加1,跳过的字节数是指针指向的数据类型的长度,
// printf("%p\n",(p+i)); //在这里指跳过的是4个字节sizeof(int)
//
// }
//
// char ch = 'a';
// char *p1 = &ch;
// printf("%p\n",p1);
// p1++;
// printf("%p\n",p1);
// return 0;
//}

//减法运算

//两个指针进行减法运算得到的是两个指针地址之间的元素个数

//不同类型的指针不能进行减法运算

//指针不能进行加法运算,因为可能会超过内存边界
//int main(int arg ,const char *argv[])
//{
// int a[10] = {};
// int *p = a;
// int *q = &a[5];
// printf("%p %p\n",p,q);
// printf("%ld\n",q-p); //(q-p)/sizeof(int)
//
// return 0;
//}

//
// applicationOfPointer.c
// IOS150603
//
// Created by
Peng Junlong on 15/6/3.
// Copyright (c) 2015年 Peng Junlong. All rights reserved.
//

//*************************
//* *
//* 指针的应用 *
//* *
//*************************
#include <stdio.h>

//void swap(int *a,int *b)
//{
// int p = *a;
// *a = *b;
// *b = p;
//}
//int main(int arg,const char *argv[])
//{
// int a = 10;
// int b =20;
// printf("a = %p,b = %p\n",&a,&b);
// printf("a = %d,b = %d\n",a,b);
// swap(&a,&b);
// printf("a = %p,b = %p\n",&a,&b);
// printf("a = %d,b = %d\n",a,b);
// return 0;
//}

//利用指针输入10个数到数组中,再输出
//int main(int arg ,const char *argv[])
//{
// int a[10];
// int *p = a;
// for (int i=0; i<10; i++) {
// scanf("%d",p+i);
// }
// for (int i=0; i<10; i++) {
// printf("a[%d]=%d ",i,*(p+1));
// }
//
// return 0;
//}

//指针实现数组逆序
//void reverseArray(int *a,int len)
//{
// for (int i=0; i<len/2; i++) {
// int temp = *(a+i);
// *(a+i) = *(a+len-i-1);
// *(a+len-i-1) = temp;
// }
//}
//int main(int arg ,const char *argv[])
//{
// int a[10];
// int *p = a;
// for (int i=0; i<10; i++) {
// scanf("%d",p+i);
// }
// reverseArray(a, 10);
// for (int i=0; i<10; i++) {
// printf("a[%d]=%d ",i,*(a+i));
// }
//
// return 0;
//}

//void replace(char *array,char old ,char new ,int len)
//{
// for (int i=0; i<len; i++) {
// if (*(array+i) == old) {
// *(array+i) = new;
// }
// }
//}
//int main(int arg ,const char *argv[])
//{
// char array[10];
// char *p = array;
// char old;
// char new;
// for (int i=0; i<10; i++) {
// scanf("%c",p+i);
// }
// getchar();
// printf("输入 old:");
// scanf("%c",&old);
// getchar();
// printf("输入new:");
// scanf("%c",&new);
// replace(array,old,new,10);
// for (int i=0; i<10; i++) {
// printf("%c",*(array+i));
// }
// return 0;
//}

//void insert(char *array,int index,char new ,int length)
//{
// for (int i=length-1; i>=index; i--) {
// *(array+i+1)=*(array+i);
// }
// *(array+index) = new;
//}
//int main(int arg,const char *argv[])
//{
// char array[12] = "helloworld";
// insert(array, 6, 'A', 10);
// printf("%s\n",array);
// return 0;
//}

//const 与 指针

//只读的
//const type name
//type const name
int main(int arg,const char *argv[])
{
const int a = 100;
//a = 200; // a是只读的,不能进行修改,在这里进行会报错

//****************************************************

int b = 10;
int c = 20;
const int *p = &b; //const 是修饰*p,在这里*p是只读的,p是可读可写的
//*p = 30; //这里是错误的
p = &c;

//****************************************************
int d = 10;
const int *const q = &d;//*q 和q都是只读的

//****************************************************
int e = 10;
const int *p1 = &e,q1 = 20;//*p1和q1都是只读的,p1是可读可写的

const int *const p2,*q2; //p2,*p2,*q2都是只读的,q2是可读可写的
const int *const p3,*const q3; //p3,*p3,q3,*q3都是只读的

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: