LinuxC学习日常——指针

1、指针变量的定义

int a;

int *p = &a;

* 表示这个变量是一个指针,int代表这个指针所指向的地址中保存的数据的类型,也可以是char、double等类型,但必须和指针所指向的地址中保存的数据类型一致。

指针变量中保存的是地址,所以必须将a的地址赋值给指针变量p。


2、指针变量的大小

指针变量的大小只与编译器的位数有关,由于指针内部存的是地址,32为情况下地址都是32位的,所以在32位的编译器下指针都是4个字节,在64位编译器下则是8个字节。


3、指针变量的取值

在变量定义时 * 号代表该变量为指针变量,在使用指针变量时*号代表取指针所指向的那块内存的值也就是说 *+地址 表示指针指向的那块内存的值。

#include <stdio.h>
int main()
{
	int a = 10;
	int b = 20;
	
	int *pa = &a;
	int *pb = &b;
	
	// 通过 pa 与 pb 交换 a 与 b 的值
	int tmp = *pa;
	*pa = *pb;
	*pb = tmp;
	
	return 0;
}

4、数组指针

指向数组的指针叫数组指针,数组名代表数组首个元素的地址

如:int a[5];

a = &a[0],&a是数组的地址要和数组首个元素的地址区分开。

数组名代表数组首个元素的地址,在某些场合可以当指针使用。

数组指针与数组的差异1:数组指针不能代替数组名求数组长度。(指针在32位编译器下永远是4个字节)

数组指针与数组的差异2:数组是一个常量不能改变。(不能出现数组名自加或者自减的情况)

#include <stdio.h>//指针方式逆序数组

int main()
{
	int a[10] = {1,2,3,4,5,6,7,8,9,10};
	
	int *p1 = a;     // 指向数组的第一个元素
	int *p2 = a + sizeof(a)/sizeof(a[0]) - 1;

	while (p1 < p2)
	{
		int tmp = *p1;
		*(p1++) = *p2;
		*(p2--) = tmp;
	}
	
	int i;
	for (i = 0; i < 10; i++)
	{
		printf ("%4d", a[i]);
	}
	
	printf ("\n");
	
	return 0;
}

5、字符串指针

字符串指针的使用方法和数组指针差不多,字符串指针是用来指向字符串数组或者字符串常量的。

#include <stdio.h>
#include <string.h>

int main1()
{
	char ch[] = "hello";
	char *pch = ch;
	
	printf ("%s\n",pch);
	int i;
	for (i = 0; i < strlen(ch); i++)
	{
		printf ("%c", *(pch+i));
	}
	putchar ('\n');
	
	puts(pch);
	
	char str[10];
	char *pstr = str;
	
	scanf ("%s", pstr);
	
	puts(str);
	
	
	return 0;
}
典型错误1:将一个字符串写到一个没有初始化的指针位置即野指针。

典型错误2:用指针去修改一个字符串常量的值。

一个字符串常量可一代表这个字符串的首地址,可以用 char* 类型的指针指向它。


#include <stdio.h>//句子逆序
#include <string.h>

int main()
{
	// char *p = "I am from shanghai";
	// char str[] = "I am from shanghai";
	char str[] = "you are from shanghai";
	
	// 将整个字符串逆序
	char *p1 = str;
	char *p2 = str + strlen(str) - 1;
	char *p3 = NULL;  // 用于将单词逆序
	char tmp;
	while (p1 < p2)
	{
		tmp = *p1;
		*(p1++) = *p2;
		*(p2--) = tmp;
	}
	puts(str);
	
	// 再将每一个单词进行逆序,单词通过空格去找
	p1 = str;
	p2 = str;
	
	while(*p2) // p2找到字符串结束为止
	{
		if (*p2 == ' ') // 找到一个单词,要将前面的单词进行逆序
		{
			p3 = p2 - 1;
			while (p1 < p3)
			{
				tmp = *p1;
				*(p1++) = *p3;
				*(p3--) = tmp;
			}
			p1 = p2 + 1;
		}
		p2++;
	}
	
	p3 = p2 - 1;
	while (p1 < p3)
	{
		tmp = *p1;
		*(p1++) = *p3;
		*(p3--) = tmp;
	}
	
	puts(str);
	
	return 0;
}

6、指针数组

一个数组,数组内的每个元素都是指针。


7、二维数组指针

int a[3][5]

int (*p)[5] = a;







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值