一、指针简介(任何指针变量在内存中占八个字节的存储空间)

1.定义指针变量(格式):变量类型 *变量名;--定义一个指向整形变量的指针  int *p;

2.作用:指针变量就是用来存储其他变量的地址;--int a=10;

  //指针将变量a的地址赋给指针变量p

  p = &a;//&是取地址符号,数组有两种方法获得内存中的地址--例:

  方法1:数组的变量名就是数组内存中的地址

  //定义一个int类型的数组

  int ages[2] = {10, 20 };//将数组的地址赋给指针变量p

  p = ages;  或者  p = &ages;

  方法2:数组中的第一个的地址就是该数组的地址--定义变量之后,在内存中开辟存储空间是从大到下寻地址,存放变量时,是在开辟的空间中,从小到大分配地址

  p = ages[0];

  图解:只是为了讲解,内存地址有地方不对

3.访问:

  指针变量中存入了某个变量的地址后,,可以通过地址来访问或者改变地址中的变量,方式:

  *p = 11;

二、指针注意点:

1.任何指针变量都占用8个字节的存储空间

2.指针类型只能指向对应类型的变量,比如int *p只能指向int类型的数据,不然会出错

3.指针是用来存储地址的,不要随便赋值一个变量。例如:

  float *p1 ; p1 = 100 ;--这是错误写法

4.float f =1.5f ;

  float *p = &f ;//这一句代码其实做了2件事--1)定义了指针变量p;2)让指针变量p指向了f

  *p = 5.6f ;

三、指针和数组

利用指针遍历数组元素,方法一:这种遍历方式,指针的值从未变过

 void test3()
{
int ages[] = {, , , }; int *p = ages; //p + 1; // &ages[1]
//p + 2; // &ages[2]
//p + 3; // &ages[3]
//p + i; // &ages[i] for (int i = ; i<; i++)
{
int num = *(p + i);
printf("ages[%d]=%d\n", i, num);
} // 这种遍历方式,指针的值从未变过
printf("%d\n", *p); }

利用指针遍历数组元素,方法二:这种遍历方式,指针的值一直在改变

 void test5()
{
int ages[] = {, , , }; int *p = ages; for (int i = ; i<; i++)
{
printf("ages[%d]=%d\n", i, *p);
p++;
// p = p + 1;
} // 这种遍历方式,指针的值一直在改变
}

四、详解指针的p+1

1.指针变量的+1并不是基本数据类型中简单的+1;

2.p+1究竟是增加了多少,取决于指针的类型;

  指针的p+1跟指针所指向的数据类型有关,如下:

  char *    1

  int *       4

  double *    8

  long *    8

五、指针与字符串:重点--char *name = "hello" ;-->不可改变(可以理解为字符串常量)        char name[] = "hello" ;-->可以改变(可以理解为字符串变量)

1.利用数组存储的字符串是可变的

 void test1()
{
int a; // 利用数组存储的字符串是可变的
char names[] = "itcast"; //char names[] = {'i', 't', 'c', 'a', 's','t', '\0'}; char *p = names; *(p + ) = 'A'; //printf("%s\n", p + 2); printf("%s\n", names);
}

2.直接利用 指针变量指向的字符串,是不可变的

 void test2()
{
// names这个指针变量指向了字符串的首字符'i'
// 直接利用指针变量指向的字符串,是不可变
char *names = "itcast";
char *names2 = "itcast"; // names和names2指向的是同一个字符
printf("names=%p\n", names);
printf("names2=%p\n", names2);
}

3.学习指针之前的字符串存储

  char name[] = "hello" ;

  char names[2][10] = { "hello" , "world" };

4.学习指针之后的字符串存储:

  char *name = "hello" ;

  //指针数组:数组里面装的元素是指针

  //整形数组:数组里面装的元素是整型数据

  char *names[2] = { "hello" , "world" } ;

C基础--初学指针的更多相关文章

  1. GO学习-(10) Go语言基础之指针

    Go语言基础之指针 区别于C/C++中的指针,Go语言中的指针不能进行偏移和运算,是安全指针. 要搞明白Go语言中的指针需要先知道3个概念:指针地址.指针类型和指针取值. Go语言中的指针 任何程序数 ...

  2. C++基础——函数指针 函数指针数组

    ==================================声明================================== 本文版权归作者所有. 本文原创,转载必须在正文中显要地注明 ...

  3. go基础语法-指针

    1.基础定义 golang的指针没有cpp等语言的指针复杂,具体表现在其不可用于运算.只有值传递 语法:var variableName *int = memoryAddr var a = 2 var ...

  4. 黑马程序员_ C语言基础之指针(三)

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 概览 指针是C语言的精髓,但是很多初学者往往对于指针的概念并不深刻,以至于学完之后随着时间的推移 ...

  5. C++学习基础二——指针与引用的区别

    一.指针: (1)如果对指针进行解引用操作 赋值,改变的是指针所指向对象的值:(2)如果不对指针进行解引用操作 赋值,则改变的是指针本身的值:(3)const指针本身的值不能修改,但是const指针所 ...

  6. C基础--函数指针的使用

    之前在看代码的时候,看了函数指针的使用,大体分为如下几类: 做一个function list,通过指针索引调用,使得处理功能类似的函数看起来更加清晰: 函数指针作为另一个函数的参数,用作回调: lin ...

  7. C语言基础:指针类型与指针和数组、字符串的关系

    //指针变量就是用来存储地址的,只能存储地址 格式:  int  *p;  这个p为指针变量:指针变量占8个字节 类型是用来说明这个指针指向的类型: 比如上边的int代表这个指针变量会指向int类型的 ...

  8. 【C++基础】 指针&字符串&数组

    先贴代码,总结以后再写,和5中内存分配方式密切相关 PS: str 返回整个字符串,str[0],*str返回首字符h char *strA(){ char str[]="hello!&qu ...

  9. 【C++基础】指针好难啊,一点点啃——基本概念

    指针保存的是另一个对象的地址(概念真的很重要!!) ; int *ptr = &a;//*定义一个指向int类型的指针ptr, &a取变量a的地址 引用是对象的别名,多用于函数形参,引 ...

随机推荐

  1. 1.素数判定(如何输出\n,\t,不用关键字冲突)

    题目描述 Description 质数又称素数.指在一个大于1的自然数中,除了1和此整数自身外,不能被其他自然数整除的数. 素数在数论中有着很重要的地位.比1大但不是素数的数称为合数.1和0既非素数也 ...

  2. HDU 4406 最大费用最大流

    题意:现有m门课程需要复习,已知每门课程的基础分和学分,共有n天可以复习,每天分为k个时间段,每个时间段可以复习一门课程,并使这门课程的分数加一,问在不挂科的情况下最高的绩点. 思路:(没做过费用流的 ...

  3. java7-3 继承

    1.继承概述: 把多个类中相同的内容给提取出来定义到一个类中. 如何实现继承呢? Java提供了关键字:extends 格式: class 子类名 extends 父类名 {} 父类也称为基类.超类: ...

  4. tp2.2.2新特点

    1.不需要在配置文件中配置URL_MODEL变量就可以用普通模式和路径模式及兼容模式访问URL,但重写模式不可以. 2.当访问的URL地址没有指明具体动作(控制器里的方法)的时候,如果该控制器对应的视 ...

  5. javascript中的hasOwnProperty和isPrototypeOf

    hasOwnProperty:是用来判断一个对象是否有你给出名称的属性或对象.不过需要注意的是,此方法无法检查该对象的原型链中是否具有该属性,该属性必须是对象本身的一个成员.isPrototypeOf ...

  6. JavaScript中浏览器兼容问题

    浏览器兼容性问题是在实际开发中容易忽略而又最重要的一部分.我们在讲老版本浏览器兼容问题之前,首先要了解什么是能力检测,它是来检测浏览器有没有这种能力,即判断当前浏览器是否支持要调用的属性或者方法.下面 ...

  7. C++ List的用法(整理)

    转自http://blog.csdn.net/lskyne/article/details/10418823 Lists将元素按顺序储存在链表中. 与 向量(vectors)相比, 它允许快速的插入和 ...

  8. jQuery Event.stopPropagation() 函数详解

    stopPropagation()函数用于阻止当前事件在DOM树上冒泡. 根据DOM事件流机制,在元素上触发的大多数事件都会冒泡传递到该元素的所有祖辈元素上,如果这些祖辈元素上也绑定了相应的事件处理函 ...

  9. 2016喜剧《死侍》韩版.HD720P中英双字

    导演: 蒂姆·米勒编剧: 略特·里斯 / 保罗·沃尼克 / 费边·尼谢萨 / 罗伯·莱菲尔德主演: 瑞恩·雷诺兹 / 莫蕾娜·巴卡林 / 艾德·斯克林 / T·J·米勒 / 吉娜·卡拉诺 / 更多.. ...

  10. 用python简单处理图片(4):图像中的像素访问

    前面的一些例子中,我们都是利用Image.open()来打开一幅图像,然后直接对这个PIL对象进行操作.如果只是简单的操作还可以,但是如果操作稍微复杂一些,就比较吃力了.因此,通常我们加载完图片后,都 ...