c语言或符号运算(c语言入门必背单词)

用指针访问一维数组

数组里面所有的元素是连续的内存存放的,数组名是数组第一个字节的内存地址,并且数组名a也表示指针,在表达式可以被转换为和 p 等价的指针!a作为右值 并不表示a地址存储的内容, 而是数组首元素首地址

c语言或符号运算(c语言入门必背单词)

指针进行加法(减法)运算时,它前进(后退)的步长与它指向的数据类型有关。p指向的数据类型是int ,在内存中占4个字节(Byte) ,p+1表示前进4个字节。

用指针访问二维数组

先看看常见指针变量的定义:

c语言或符号运算(c语言入门必背单词)c语言或符号运算(c语言入门必背单词)

int a[2][3] = { { 2,3,6 },{ 4,5,8 }};
	
	int(*p)[3] = a;//数组指针,指向一维数组的指针,
	printf("a=%p &a[0]=%pn", a, &a[0]);//400
	printf("*a=%p  a[0]=%p &a[0][0]=%pn", *a, a[0],&a[0][0]);//400 一维数组首元素的首地址
	//使用整个数组的数据没有实际的含义,编译器遇到这种情况都会转换为指向该一维数组第 0 个元素的指针

	printf("(a+1)=%p &a[1]=%pn", a + 1, &a[1]);//412
	printf("*(a+1)=%p a[1]=%p &a[1][0]=%pn",*(a + 1), a[1], &a[1][0]);// 
	
	printf("*(a+1)+2=%p a[1]+2 = %p &a[1][2]=%pn",*(a + 1) + 2,a[1] + 2,&a[1][2]);//420
	printf("*(*a+1)=%d  *(a[0]+1)=%d  a[0][1]=%d", *(*a + 1), *(a[0] + 1),a[0][1]);//3
	

指针进行加法(减法)运算时,它前进(后退)的步长与它指向的数据类型有关

p的数据类型为int (*) [3],一维数组a[0]有3个整型数据就是12个字节,a+1 = 412

a[0]的数据类型为int *

一个小练习:打印出字符串指针数组中每一个字符

指针法:字符串相当于一个一位数组

#include<stdio.h>

int main()
{
	char * array[5] = { "array","11","kankanshisha","pointer","c program" };
  
	char * (*p) = array;//指向数组元素(char指针类型)的首地址的指针

 
	for (int i = 0; i < 5; i++)
	{
		for (int j = 0; '' != *(*(p + i) + j); j++) 
		{
			printf("%c", *(*(p + i) + j));
		}
		printf("n");
	}
	return 0;
}

数组下标法:

#include<stdio.h>

int main()
{
	char * array[5] = { "array","11","kankanshisha","pointer","c program" };

	char * (*p)[5] = &array;//指向数组首地址的指针 (*p)===数组名字array


	for (int i = 0; i < 5; i++)
	{
		for (int j = 0; (*p)[i][j]!=''; j++)
		{
			printf("%c", (*p)[i][j]);
		}
		printf("n");
	}
	return 0;
}
版权声明:(恩蓝小号)内容由互联网(c语言或符号运)用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 71441083@qq.com 举报,一经查实,本站将立刻删除。

发表评论

登录后才能评论