指针(上)

指针的定义和使用:
int a=10;
int* p=&a;
指针是一种数据类型    p是指的指针类型变量   用来指向一个变量地址
指针类型在内存中的大小:在32位操作系统中所有指针类型的大小都是4字节大小
在地址的前面加上*可以取值 (内存地址)   可以找到对应的内存地址的值
例如:
int a=10;
int* p=&a;
*p=20;//此时a的值为20    
无论什么类型的指针,存的都是地址
内存地址都是无符号整型的,所以都是4字节大小(这是在32位操作系统下,在64位系统中为8字节大小)

万能指针
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
int main()
{
 int a = 10;
 //int* p = &a;
 void * p = &a;
 *(int*)p = 100;//把void*p类型强制转化为int*p类型
 printf("%d\n", a);
 printf("%d\n", *(int*)p);
  system("pause");
 return EXIT_SUCCESS;
}
 
 
int main()
{
 int arr[10];
 void * p = arr;
 *(int*)p = 100;//arr[0]=100
 *((int*)p + 1) = 200;//p转化为整数类型之后加1就能到达arr[1],并给arr[1]赋值
 for (int i = 0; i < 10; i++)
 {
  printf("%d\n", arr[i]);
 }
 return 0;
}
 

const修饰指针
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
int main()
{   //这种方式不安全  可以通过指针修改
 //1.通过指针修改const修饰的常量
 const int a = 10;
 int * p = &a;
 *p = 100;
 printf("%d\n", a);
 printf("%d\n", *p);
  system("pause");
 return EXIT_SUCCESS;
}
 
int main()
{
 int a = 10;
 //如果const修饰int*不能改变指针变量的内存地址的值   但是可以改变指针指向的地址
 const int * p;
 p = &a;
 *p = 100;
 printf("%d\n", *p);
 return 0;
}

3.const修饰指针变量   能改变指针变量地址的值    但不能改变指针指定的地址
4.const修饰指针类型,也修饰指针变量,那麽不能修改指针指向的地址 也不能修改指针指向的值
 
const修饰内容                                                 结果
1.const int a=10;                                        可以通过1级指针修改一个常量的值
   int * p=&a;
   *p=100;

2.const int * p=&a;                                    const修饰指针类型,可以改变指针指向的地址
p=&b;
 
3.int * const  p=&a                                      const修饰变量,可以修改指针指向的地址上的值
*p=100;

4.const int* const p=&a                               const修饰指针的类型,const修饰指针的变量,都不能修改
  
 
指针和数组:
数组名是数组的首地址,这是一个常量,无法修改
int* p=arr //p=arr   [数据类型*]变量名
指向数组的指针   当操作指针时  间接操作了数组
arr[2]指的是第二个元素的值
p++  *p=2    是p先加一,再赋值给p,此时p指的是第二个元素 ,再给第二个元素赋值为2
数组名和指针的区别:数组名通过sizeof可以求出数组的大小   指针只包含数组首地址的信息

posted on 2019-04-16 15:57  不冒泡的苏打水  阅读(108)  评论(0编辑  收藏  举报

导航