C--指针

一、指针的理解

注:
(1)指针变量使用之前必须赋值,未赋值的指针变量不能使用,否则将造成系统还乱,甚至死机
(2)指针变量只能赋予地址。

举例:

int a = 1;
int *p = &a; (int 类型说明符,说明指针变量值是int型变量的地址,同时也是地址操作中步长的依据)

 

二、数组与指针

1、要点

(1)数组变量可以用作指针,但是数组变量和指针又不完全一样。

(2)对数组变量和指针变量使用sizeof,效果不同。

(3)数组变量不能指向其他地方。

(4)把数组变量传给指针,会发生退化。

(5)索引的本质是指针算术运算,所以数组从0开始。

(6)指针变量具有类型,这样就能调整指针算术运算。

2、用指针输入数据

(1)scanf

//
#include <stdio.h>

int main()
{
    char name[10];
    scanf("%s", name);
    printf("input  is : %s\n", name);
    return 0;
}
//

当输入数据超过name数组长度就会报段错误,应该成scanf("%9s", name).

(2)fgets

//
#include <stdio.h>

int main()
{
    char name[10];
    fgets(name, sizeof(name), stdin);
	/* 数组指针、最大长度、数据来键盘 */
    printf("input  is : %s\n", name);
    return 0;
}
//

(3)两者比较

    A、fgets的使用比scanf更加安全。

    B、scanf能输入多字段,但是fgets不行

    C、scanf中不能有空格,但是fgets没有这限制

3、指向字符串的字符数组与指针变量

(1)代码

//
#include <stdio.h>

int main()
{
	char *cards = "JQK";
	char a_card = cards[2];
	cards[2] = cards[1];
	cards[1] = cards[0];
	cards[0] = cards[2];
	cards[2] = cards[1];
	cards[1] = a_card;
	puts(cards);
	return 0;
}
//

(2)运行结果:运行后,报总线错误或者是段错误。

(3)原因:字符串字面值不能更新。即不能用char *cards = "JQK";中的变量"JKQ"修改这个字符串"JQK"。

(4)改正:如果这么创建就可以char cards[] = "JQK";

(5)从存储角度分析

(6)要点

 

    A、变量声明中看到*,说明变量是指针。

    B、字符串字面值保存在只读存储器中。

    C、如果想修改字符串,需要在新的数组中创建副本。

    D、可以将char指针声明成为const char *,以防代码用它修改字符串。

 

三、示例代码

1、指针 & 非指针

//
#include <stdio.h>

void swap(int a, int b)
{
	int tmp = a;
	a = b;
	b = tmp;
}

int main()
{
	int num0 = 3;
	int num1 = 5;
	swap(num0, num1);
	printf("num0 is : %d\n", num0);
	return 0;
}
//

 

//
#include <stdio.h>

void swap(int *a, int *b)
{
	int tmp = *a;
	*a = *b;
	*b = tmp;
}

int main()
{
	int num0 = 3;
	int num1 = 5;
	swap(&num0, &num1);
	printf("num0 is : %d\n", num0);
	return 0;
}
//

 

 

 

致谢

1、《C语言编程魔法书》作者 陈轶

2、《C语言程序设计》[第四版],作者谭浩强

3、《C程序设计语言》[第二版],作者 Brian W.Kernighan, Dennis M.Ritchie     

 

 

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 技术黑板 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读