Pointer
Define an Array
#include <stdio.h>

int main()
{
	int a = 10;
	int *ptr = NULL; // NULL is constant zero

	ptr = &a;

	printf("a: %d\n", *ptr);

	return 0;
}
		
Pointer Arithmetic
#include <stdio.h>

int main()
{
	int a[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
	int *ptr;

	ptr = a;

	int i;
	for(i = 0; i < 10; i++)
		printf("%d, %d\n", i, *(ptr+i));

	return 0;
}
		
Pass Pointer to Function and Return Pointer from Function
#include <stdio.h>
#include <stdlib.h>

int * getArray(int size)
{
	int *array;
	array = (int*) malloc(size*sizeof(int)); // allocate memory

	int i;
	for(i = 0; i < size; i++)
		array[i] = i;

	return array;
}

void disp(int *array, int size)
{
	int i;
	for(i = 0; i < size; i++)
		printf("%d, %d\n", i, array[i]);
}

int main()
{
	int *array;

	array = getArray(10); // get array

	disp(array, 10);

	free(array); // release memory

	return 0;
}
		
Pointers to Constants
#include <stdio.h>

void disp(const int *array, int size)
{
	int i;

	for(i = 0; i < size; i++)
		printf("%d\n", array[i]);

	//array[0] = 10; // error
}

int main()
{
	const int array[] = {0, 1, 2, 3};

	disp(array, 4);

	return 0;
}
		
Two-Dimensional Array
// single pointer
#include <stdio.h>
#include <stdlib.h>

void setArray(int *array, int r, int c)
{
	int i, j;
	for(i = 0; i < r; i++)
		for(j = 0; j < c; j++)
			*(array+i*c+j) = i*10 + j;
}

void dispArray(int *array, int r, int c)
{
	int i, j;
	for(i = 0; i < r; i++)
	{
		for(j = 0; j < c; j++)
			printf("%10d", *(array+i*c+j));
		printf("\n");
	}
}

int main()
{
	int r = 3, c = 4;
	int *array;
	array = (int*)malloc(r*c*sizeof(int)); // allocate memory

	setArray(array, r, c);
	dispArray(array, r, c);

	free(array); // free memory
}
		
// array of pointer
#include <stdio.h>
#include <stdlib.h>

void setArray(int *array[], int r, int c)
{
	int i, j;
	for(i = 0; i < r; i++)
		for(j = 0; j < c; j++)
			array[i][j] = i*10 + j;
}

void dispArray(int *array[], int r, int c)
{
	int i, j;
	for(i = 0; i < r; i++)
	{
		for(j = 0; j < c; j++)
			printf("%10d", *(*(array+i)+j));
		printf("\n");
	}
}

int main()
{
	int r = 3, c = 4;
	int *array[r];

	int i;
	for(i = 0; i < r; i++)
		array[i] = (int*)malloc(c*sizeof(int));

	setArray(array, r, c);
	dispArray(array, r, c);

	for(i = 0; i < r; i++)
		free(array[i]);
	
	return 0;
}
		
// pointer to pointer
#include <stdio.h>
#include <stdlib.h>

void setArray(int **array, int r, int c)
{
	int i, j;
	for(i = 0; i < r; i++)
		for(j = 0; j < c; j++)
			array[i][j] = i*10 + j;
}

void dispArray(int **array, int r, int c)
{
	int i, j;
	for(i = 0; i < r; i++)
	{
		for(j = 0; j < c; j++)
			printf("%10d", *(*(array+i)+j));
		printf("\n");
	}
}

int main()
{
	int r = 3, c = 4;
	int **array;

	// allocate two-dimensional array with a double pointer
	array = (int **)malloc(r*sizeof(int *));

	int i;
	for(i = 0; i < r; i++)
		array[i] = (int*)malloc(c*sizeof(int));

	setArray(array, r, c);
	dispArray(array, r, c);

	// free memory
	for(i = 0; i < r; i++)
		free(array[i]);

	free(array);
	
	return 0;
}
		
String
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
	char *array;

	size_t n = 80*sizeof(char);
	array = (char *)malloc(n);

	printf("Please enter your name:\n");
	scanf("%s", array);

	printf("%s, length is %lu\n", array, strlen(array));

	return 0;
}
		
Pass Arguments to Program
#include <stdio.h>

int main(int argc, char *argv[])
{
	int i;
	for(i = 0; i < argc; i++)
		printf("Argument %d: %s\n", i, argv[i]);

	return 0;
}